面试常见题。
事实上在语法上是没有问题的,编译可以通过。问题在于构造函数中调用虚函数无法实现多态。
看下面的代码:
class A
{
public:
A() { show(); }//行4
virtual void show() { cout << "A"; }
void anotherShow(){show();}//行6
};
class B:public A
{
public:
B() { show(); }
virtual void show() { cout << "B"; }
};
当我们定义一个B类对象时,输出的是AB。
B b;//输出:AB
而当我们调用b对象中的anotherShow时,输出的是B.
b.anohterShow();//输出:B
可以看出,在行4中调用的是父类的show,而在行6中调用的是子类的show。
这是因为在定义子类对象的时候,会先调用父类的构造函数。、
而此时虚函数表以及子类的函数还没有被初始化,为了避免调用到未初始化的内存,C++标准规范中规定了在这种情况下,即在构造子类时调用父类的构造函数,而父类的构造函数中又调用了虚成员函数,这个虚成员函数即使被子类重写,也不允许发生多态的行为。
所以使用的是静态绑定,调用了父类的函数。
————————————————
原文链接:https://blog.csdn.net/huang1433/article/details/50932427