【问题标题】:How to solve Diamond problem with pure virtual function如何用纯虚函数解决钻石问题
【发布时间】:2019-04-19 13:57:36
【问题描述】:
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
{

};

我将一个纯虚函数带入基类。我在创建从我的基类继承的派生和派生1类时使用虚拟关键字,最后我创建了从派生和派生1继承的派生2类,然后我会得到错误“派生2:基类的模糊继承::无效(显示) "如何解决这个错误?

【问题讨论】:

  • 提供 void derived2::display(void)
  • 如果你不告诉编译器如何决定在两者之间使用哪个display
  • 好吧,你已经解决了钻石问题。您现在所拥有的只是一个多重继承问题。
  • 一头猪说“oink, oink”。狗会说“汪,汪”。根据这些信息,你能分辨出猪狗在说什么吗?
  • Nitpick:要么你有 using namespace std; 并且你没有在任何地方使用 std:: 资格,要么你在任何地方都使用它!

标签: c++ overriding multiple-inheritance virtual-functions virtual-inheritance


【解决方案1】:

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

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

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

class derived2 : public derived, derived1 {
  public:
    void display() override {
      derived::display(); // or derived1::display();
    }
}

【讨论】:

  • “derived::display() 和 derived1::display() 也必须标记为虚拟”。不,这不是必需的。不过,将它们标记为override 是一种很好的风格。
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多