Как решить проблему Diamond с чисто виртуальной функцией - PullRequest
0 голосов
/ 16 ноября 2018
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, тогда я получу ошибку "производная2: неоднозначное наследование base :: void (display)Как решить эту ошибку?

1 Ответ

0 голосов
/ 16 ноября 2018

Вам необходимо решить, какой из этих двух методов является производным, поскольку и производный, и производный1 обеспечивают реализацию.

Используя не виртуальные функции, решение будет более простым: просто напишите using derived::display или using derived1::display

Но вы используете виртуальные функции, поэтому вам нужно будет добавить окончательную переопределяющую функцию. Это можно сделать так:

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