C++ производный класс от двух одинаковых базовых классов

Вот мои занятия:

class Base1
{
public:
    Base1();
    ~Base1();

    virtual void main_func()=0;
}

class D1 : public Base1
{
public:
    D1();
    ~D1();

    virtual void main_func(do_d1_main(););
}
class D2 : public Base1
{
public:
    D2();
    ~D2();

    virtual void main_func(){do_d2_main();};
}

class Base2
{
public:
    Base2();
    ~Base2();

    int   m_needed_by_b1;
}
class D12B2: public Base2, public D1, public D2
{
public:
    D12B2();
    ~D12B2();
}

Вот проблема:

И то и другое do_main_func1() а также do_main_func2() нужен доступ к члену m_needed_by_b1 в Base2, Как?

Могу ли я определить виртуальную функцию main_func для каждого в пределах class D12B2? Это дало бы им доступ ко всем D12B2, в том числе Base2, Как бы я указал каждый отдельно?

Я думал о добавлении (защищенного) члена в Base1это указатель на Base2 объект. Это должно быть установлено D12B2, Кажется, что может быть более элегантный способ сделать это.

ТИА

кругозор

1 ответ

Кажется, что может быть более элегантный способ сделать это.

Скорее всего, есть - не используйте множественное наследование.

Однако, если вы собираетесь настаивать на использовании множественного наследования, есть некоторые вещи, на которые вы должны обратить внимание: D1 а также D2 должны наследоваться практически в D12B2 чтобы избежать проблемы с алмазами. Если предположить, do_d1_main а также do_d2_main на самом деле означает main_func, то вы можете реализовать D12B2::main_func который сможет получить доступ m_needed_by_b1,

Но вернемся к оригинальной заметке:

Это звучит как Base1 а также Base2 не должно существовать, и D1 а также D2 должны быть чисто абстрактные классы. Который оставил бы вас с

class D1
{
public:
    virtual void d1_func() = 0;
};

class D2
{
public:
    virtual void d2_func() = 0;
};

class D12B2 : public virtual D1, public virtual D2
{
public:
    D12B2();
    ~D12B2();

    virtual void d1_func()
    {
        // do something
    }

    virtual void d2_func()
    {
        // do something else
    }

private:
    int m_myData;
};
Другие вопросы по тегам