4
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。我需要对代码进行哪些更改才能使其正常工作?我需要在其构造函数中调用来自基类的纯虚方法。

4

3 回答 3

15

在构造函数中调用虚函数被认为是一件坏事

在派生类对象的基类构造过程中,对象的类型是基类的类型。不仅虚函数解析为基类,而且使用运行时类型信息的语言部分(例如,dynamic_cast(参见条款 27)和 typeid)将对象视为基类类型。

因此,您的实例化b调用a构造函数。调用foo(),但调用的是foo()on a。这(当然)是未定义的。

于 2013-02-12T11:09:45.983 回答
2

引自 Yashwant Kanetkar 的《Let Us C++》一书

它始终是当前类的成员函数,被调用。也就是说,虚拟机制在构造函数中不起作用

因此,foo()ofclass a被调用。既然是声明pure virtual的,就会报错

于 2013-02-12T11:41:19.050 回答
1

foo类的构造函数中调用了a函数,此时对象b还没有完全构造,因此它的foo实现是不可用的。

引自“Effective C++”:

不要在构造或销毁期间调用虚函数,因为这样的调用永远不会转到比当前执行的构造函数或析构函数更派生的类

于 2013-02-12T11:11:02.143 回答