
1)virtual指明一成员函数为虚函数,而virtual仅用于类的定义里,在类外可不加此关键字
2)一个类的成员函数被定义为虚函数时,子类该函数仍保持虚函数特征
3)子类覆盖此函数时,定义里可不加virtual关键字,但函数声明要和基类的完全一致!且此声明是必须的
4)不是纯虚函数时,父类的虚函数必须要实现; 而若将父类的虚函数设定为纯虚函数时,子类必需要覆盖之而且必须要实现之!
虚函数子类一般都是要自己实现的,实现后子类调用的时候是用的自己的
多是父类来调用这个虚函数,
classs cFather
{
public:
vistual int exp() = 0;//0纯虚,子类必须实现,可以不带,非纯虚可以不实现
}
class cSon1 :public cFather
{
int exp(){printf("this is son1\n");return 0;};
}
class cSon2 :public cFather
{
int exp(){printf("this is son2\n");return 0;};
}
int main(int argc,char argv)
{
cFather exp1 = new cSon1 ();
exp1->exp();//调用cSon1的
cFather exp2 = new cSon2 ();
exp2->exp();//调用cSon2的
system("pause");
delete exp1;
delete exp2;
reutrn 0;
}
不会执行,只会执行子类实现的函数,如果想执行父类的相应函数,可以在子类函数里用作用域限定符显示调用,例如 SubClass::fun(){ ParentClass:fun();}
介是2个问题
1当你预计当前类的子类中会有情况重新实现当前方法或属性时,需要加virtual
2当你需要使用 一个集合,这个集合类似数组(即内部元素为同一类型),并且这个集合要随时可以增册元素,则应该使用List
多态性指的是程序在运行的时候才决定调用的是基类(父类)的函数还是调用的派生类(子类)的函数
这种情况我们叫函数的覆盖
用了virtual函数 不一定就是函数的覆盖
覆盖要求函数的名相同 且参数个数 类型也相同
当参数的数目和类型不相同 (不管基类是不是有virtual关键词修饰) 我们叫函数的隐藏
(程序在编译的时候已经可以确定调用的是那一个函数了)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)