链接:https://www.nowcoder.com/questionTerminal/94b0fd680ede438ca7fdde4888a39537
来源:牛客网
class A
{
public:
A ():m_iVal(0){test();}
virtual void func() { std::cout<<m_iVal<<‘ ’;}
void test(){func();}
public:
int m_iVal;
};
class B : public A
{
public:
B(){test();}
virtual void func()
{
++m_iVal;
std::cout<<m_iVal<<‘ ’;
}
};
int main(int argc ,char* argv[])
{
A*p = new B;
p->test();
return 0;
}
以下程序输出结果是:0, 1, 2
解析:构造函数不建议调用虚函数。如果构造函数调用虚函数的话,基类的构造函数调用基类的虚函数。派生类的构造函数调用派生类自身的虚函数。派生类实例化的时候,会先调用基类的构造函数,这时候就是调用基类自身的虚函数。然后,派生类调用自身的构造函数,这时候就会调用派生类自身的虚函数。实例化以后,虽然指针声明为基类指针,但实际调用的是派生类的函数。如果派生类里面有两个同样的非虚函数,使用基类指针调用的话会调用基类的函数。