"страшный бриллиант" с полиморфизмом

У меня есть следующий код:

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 приводит к сбою, но невозможно сказать, не увидев реализацию этого метода.

Другие вопросы по тегам