构造函数可以调用虚函数吗?语法上通过吗?语义上可以通过吗?

来源:互联网 发布:倍投软件下载 编辑:程序博客网 时间:2024/04/30 18:43

问题回答:
可以;通过(程序可以正常运行);不通过(不是我们想要的结果)。


原文链接:http://www.cnblogs.com/hellogiser/p/whether-constructor-can-call-virtual-function.html

#include <iostream>using namespace std;class Base{public:    Base()    {        cout << "Base::Base()" << endl;        Foo();    }    virtual void Foo()    {        cout << "Base::Foo " << 1 << std::endl;    }};class Derived : public Base{public:    Derived() : Base(), m_pData(new int(2)) {         cout << "Derived::Derived()" << endl;         Foo();    }    ~Derived()    {        delete m_pData;    }    virtual void Foo()    {        cout << "Derived::Foo " << *m_pData << std::endl;    }private:    int *m_pData;};int main(){    Base *p = new Derived();    delete p;    return 0;}

如上程序的运行结果为:
这里写图片描述

基类部分在派生类部分之前被构造,当基类构造函数执行时派生类中的数据成员还没被初始化。如果基类构造函数中的虚函数调用被解析成调用派生类的虚函数,而派生类的虚函数中又访问到未初始化的派生类数据,将导致程序出现一些未定义行为和bug。

构造函数直接调用 纯虚函数(pure virtual function),编译会报错: unresolved externals

构造函数间接调用 纯虚函数(pure virtual function)(即:构造函数调用普通函数,但是普通函数又调用了纯虚函数),编译阶段不会报错,可以生成可执行文件,但是运行会出错,因为纯虚函数没有定义。

0 0