Как добавить окончательный переопределение - PullRequest
0 голосов
/ 26 апреля 2018

Как добавить «окончательный переопределитель» для решения этой проблемы?

#include <iostream>

struct Shape
{
  virtual void print()
  {
    std::cout << "SHAPE" << std::endl;
  }
  virtual ~Shape() {}
};

struct Box : public virtual Shape
{
  void print() 
  {
    std::cout << "BOX" << std::endl;
  }
};

struct Sphere : public virtual Shape
{
  void print() final override
  {
    std::cout << "SPHERE" << std::endl;
  }
};

struct GeoDisc : public Box, public Sphere
{
};

int main(int argc, char** argv)
{
  Shape* s = new GeoDisc;

  s->print();

  delete s;

  return 0;
}

Это сообщение об ошибке:
31: 8: ошибка: нет уникального окончательного переопределения для «виртуальной формы void»:: print () 'в' GeoDisc '

1 Ответ

0 голосов
/ 26 апреля 2018

Ключевое слово final в объявлении виртуального метода предотвращает множественное наследование, поэтому, если я попытался устранить неоднозначность в этом случае, это неправильный подход.Если и у Box, и у Sphere будет последнее слово, вы получите ошибку «виртуальная функция Shape :: print имеет более одного окончательного переопределения в GeoDisc».Правовое решение двусмысленности будет:

struct Sphere : public virtual Shape
{
  void print() override
  {
    std::cout << "SPHERE" << std::endl;
  }
};

struct GeoDisc : public Box, public Sphere
{
  void print() final override
  {
    Sphere::print();
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...