在构造函数中调用纯虚函数会产生错误

时间:2013-02-12 11:07:17

标签: c++ oop class inheritance virtual

class a //my base class
 {
public:
    a()
    {
        foo();
    }
  virtual void foo() = 0;
};



class b : public a
{
    public:
    void foo()
    {
    }
};

int main()
{
    b obj; //ERROR:  undefined reference to a::foo()
}

为什么它会给我错误?纯虚拟foo已定义。我需要在代码中进行哪些更改才能使其正常工作?我需要在其构造函数中调用基类中的纯虚方法。

3 个答案:

答案 0 :(得分:13)

在构造函数中调用虚函数是recognised as a bad thing to do

  

在派生类对象的基类构造期间,类型为   对象是基类的对象。不仅虚拟功能   解析到基类,但语言部分使用运行时   类型信息(例如,dynamic_cast(参见第27项)和typeid)处理   该对象作为基类类型。

因此,b的实例化会调用a构造函数。这会调用foo(),但调用foo()上的a。而且(当然)未定义。

答案 1 :(得分:2)

引自Yashwant Kanetkar的一本书“Let Us C ++”

  

它始终是当前类的成员函数,被调用。那就是   是的,虚拟机制在构造函数

中不起作用

因此,foo()的{​​{1}}被调用。 由于它被声明为class a,因此会报告错误

答案 2 :(得分:1)

foo函数在类a的构造函数中调用,此时,对象b尚未完全构造,因此它foo { {1}}实施不可用。

引自" Effective C ++":

  

在施工或毁坏期间不要调用虚拟功能,   因为这样的调用永远不会转到比派生类更多的派生类   当前正在执行的构造函数或析构函数