面试常见题。
事实上在语法上是没有问题的,编译可以通过。问题在于构造函数中调用虚函数无法实现多态。
看下面的代码:
class A
{
public:
A() { show(); }//行4
virtual void show() { cout << "A"; }
<span style="white-space:pre"> </span>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++标准规范中规定了在这种情况下,即在