2 способа разрешения неоднозначного наследования виртуального метода - PullRequest
4 голосов
/ 23 октября 2019

Следующий код взят из MSDN , я скопировал код здесь, чтобы не делать свой собственный пример, в основном у меня возникла эта проблема в моем проекте.

struct V {
   virtual void vf();
};

struct A : virtual V {
   void vf() override;
};

struct B : virtual V {
   void vf() override;
};

struct D : A, B {
   // Uncomment the following line to resolve.
   // void vf() override;
};

Я взялпосмотрите на этот SO Вопрос , где предлагается использовать директиву using для разрешения неоднозначного символа.

Это предложение не работает для этого примера, вместо этого для решения проблемы мы должны явнопереопределить базовые методы в производном классе.

Я бы хотел избежать явного переопределения в производном классе, поэтому возникает вопрос: почему это не может быть разрешено с помощью директивы using, как предложено в ссылке SO выше, вместо переопределения? например:

struct D : A, B {
   using A::vf(); // not going to work
};

Причина, по которой следует избегать явного переопределения, заключается в использовании кода метода в одном из базовых классов.

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

В вашем случае, я думаю, у вас есть для явного переопределения для устранения неоднозначности! Однако это было бы крайне тривиальным переопределением:

struct D : A, B {
    // Uncomment the following line to resolve.
    void vf() override { A::vf(); }
};

Это вызовет базовый класс A всякий раз, когда вызывается D::vf()! Таким образом, в соответствии с вашим последним предложением проблем нет, поскольку используется код метода "в одном из базового класса" (но вы должны указать, какой базовый класс).

2 голосов
/ 23 октября 2019

using просто решает, какой метод вы хотите вызвать, в этом случае.
D все еще должен быть законченным объектом и должен иметь окончательный переопределение для vf независимо от помощников по разрешению.
Если vf был , а не реализован в базовом классе, то using будет достаточно, так как тип завершен, и все, что вам нужно сделать, это разрешить правильный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...