Я пытаюсь решить проблему страшного бриллианта с помощью методов виртуального класса.
Давайте сначала рассмотрим случай множественного наследования с особенностью конечного виртуального метода.
Поскольку существует последний метод, нельзя объявить метод переопределения, но необходимо использовать объявление-использование, чтобы указать, какой метод следует использовать для дочернего класса.
class Mother {
public:
virtual void foo() final {}
};
class Father {
public:
virtual void foo() {}
};
class Child: public Mother, public Father {
public:
// void foo() {Mother::foo();} // This clashes with Mother::foo being final
using Mother::foo;
};
Приведенный выше код работает, как и ожидалось.
Однако, если мы перейдем к алмазоподобной структуре с абстрактным базовым классом, тот же подход больше не будет работать.
class GrandParent {
public:
virtual void foo() = 0;
};
class Mother: virtual public GrandParent{
public:
virtual void foo() override final {};
};
class Father: virtual public GrandParent{
public:
virtual void foo() override {};
};
class Child: public Mother, public Father {
using Mother::foo;
};
Компиляция вышеуказанного кода вызовет ошибку: no unique final overrider for ‘virtual void GrandParent::foo()’ in ‘Child’
.
Есть идеи, как решить эту проблему?