C++:构造函数中调用虚函数

链接: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

解析:构造函数不建议调用虚函数。如果构造函数调用虚函数的话,基类的构造函数调用基类的虚函数。派生类的构造函数调用派生类自身的虚函数。派生类实例化的时候,会先调用基类的构造函数,这时候就是调用基类自身的虚函数。然后,派生类调用自身的构造函数,这时候就会调用派生类自身的虚函数。实例化以后,虽然指针声明为基类指针,但实际调用的是派生类的函数。如果派生类里面有两个同样的非虚函数,使用基类指针调用的话会调用基类的函数。


版权声明:本文为xikangsoon原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。