类继承代码如下
问:调用输出的结果是什么
class CA
{public:
virtual void fun1()
{
cout<<"CA::fun1()"<<endl;
}
void fun2()
{
fun1();
cout<<"CA::fun2()"<<endl;
}
};
class CB:public CA
{
public:
virtual void fun1()
{
cout<<"CB::fun1()"<<endl;
}
void fun2()
{
fun1();
cout<<"CB::fun2()"<<endl;
}
};
void main()
{
CA *p =new CB();
p->fun1();
p->fun2();
}
调用输出结果为:
CB::fun1
CB::fun1
CA::fun2
原因分析:
由于
CA *p =new CB();中,虽然p是CA指针,但是他指向的虚函数表是CB的虚函数表(多态),所以调用的虚函数是CB中的虚函数;
当子类有基类的同名成员,但是却不是虚函数的时候基类的同名函数会被覆盖掉(这个是Link错误,或编译错误)这个时候函数调用更具静态类型(就是编译时候的类型)
还有。。那个fun2里不是又调用了一次fun1嘛,只要fun1是虚函数,在子类里无论怎么调用,
都应该是用子类定义的函数