【问题标题】:Calling pure virtual function in constructor gives an error [duplicate]在构造函数中调用纯虚函数会出错[重复]
【发布时间】:2013-01-27 16:09:47
【问题描述】:
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。我需要对代码进行哪些更改才能使其正常工作?我需要在其构造函数中调用基类中的纯虚方法。

【问题讨论】:

    标签: c++ oop class inheritance virtual


    【解决方案1】:

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

    在派生类对象的基类构造期间, 该对象是基类的对象。不仅做虚函数 解析为基类,但使用运行时的语言部分 类型信息(例如,dynamic_cast(参见条款 27)和 typeid) 对象作为基类类型。

    所以b 的实例化调用a 构造函数。调用foo(),但调用的是a 上的foo()。这(当然)是未定义的。

    【讨论】:

    • 我明白了。我会改变设计。
    • 将类抽象化能解决问题吗?
    • @Falaque - 我不这么认为。请参阅 Scott Meyers 的链接文章
    • @user1873947 类“a”(参见相关示例)。
    • @BrianAgnew 你或其他人能提出更好的图案/设计吗?
    【解决方案2】:

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

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

    所以,class afoo() 被调用。 由于声明为pure virtual,所以会报错

    【讨论】:

    • 它会报错...或者编译正常但是会导致UB,崩溃如果你幸运的话。无论哪种方式,都不要这样做。
    【解决方案3】:

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

    引自《Effective C++》:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 2012-01-28
      • 2013-02-18
      • 2012-01-27
      • 2013-09-06
      • 2012-03-20
      相关资源
      最近更新 更多