如何用纯虚函数解决钻石问题

Roh*_*are 1 c++ overriding virtual-functions multiple-inheritance virtual-inheritance

class base
{
  public:
     virtual void display() = 0;
};

class derived : virtual public base
{
 public:
    void display()
    {
        cout << "Display of derived : " << std::endl;
    }
};

class derived1 : virtual public base
{
  public:
    void display()
    {
        cout << "Display of derived : " << std::endl;
    }
};

class derived2 : public derived, derived1
{

};
Run Code Online (Sandbox Code Playgroud)

我将一个纯虚函数放入基类中。我在创建从基类继承的派生类和派生类 1 时使用 virtual 关键字,最后创建了从派生类和派生类 1 继承的派生类 2,然后我会收到错误“派生类:base::void(display) 的继承不明确” “如何解决这个错误?

Jul*_* vD 5

您需要确定这两个方法中哪一个是派生方法,因为衍生方法和派生方法都提供了实现。

使用非虚函数,解决方案会更直接:只需编写using derived::displayusing derived1::display

但是您使用的是虚函数,因此您需要添加一个最终的重写函数。可以这样做:

class derived2 : public derived, derived1 {
  public:
    void display() override {
      derived::display(); // or derived1::display();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • “衍生::显示()和衍生1::显示()也必须标记为虚拟”。不,这没有必要。不过,将它们标记为“覆盖”是一种很好的风格。 (6认同)