"страшный бриллиант" с полиморфизмом
У меня есть следующий код:
class Base
{
public:
virtual void doSomething() = 0;
};
class BaseImpl : public virtual Base
{
public:
virtual void doSomething() {
// something
}
};
class BaseDerived: public virtual Base
{
public:
virtual void doSomething2() = 0;
};
class BaseDerivedImpl: public BaseImpl, public BaseDerived
{
public:
virtual void doSomething2(){
// sonething2
}
};
Тогда у меня есть
Base* b = new BaseImpl();
b->doSomething(); // fatal error at this line (not in the method, but in the method invocation)
Проблема в том, что он даже не входит в функцию.
Что-то не так с использованием такой иерархии?
1 ответ
Поскольку ОП игнорирует комментарии, позвольте мне ответить на вопрос здесь:
Что-то не так с использованием такой иерархии?
Нет, все в порядке. Это стандартный способ решения проблемы "страшного алмаза" (что на самом деле не так уж страшно).
Тем не менее, бриллиант даже не играет в этом примере:
Base* b = new BaseImpl();
BaseImpl
происходит непосредственно от Base
так что у вас стандартное одиночное наследование. Ваш код ведет себя так же, как если бы BaseDerived
а также BaseDerivedImpl
не были определены вообще. Вы можете закомментировать их, и приложение все равно будет зависать.
Тогда вы звоните doSomething
в этом случае и он падает. Реализация doSomething
как следует:
// something
Таким образом, мой вывод таков, что // something
приводит к сбою, но невозможно сказать, не увидев реализацию этого метода.