У меня есть ситуация, как показано ниже:Требуется ли множественное наследование?
class A {
virtual void f() { /*some default impl here*/}
virtual void g() { /*some default impl here*/}
};
class B : public A {
virtual void f() { /* do some specific stuff and call parent's f()*/}
virtual void g() { /* do some specific stuff and call parent's g()*/}
};
class C : public A {
virtual void f() { /* do some specific stuff and call parent's f()*/}
virtual void g() { /* do some specific stuff and call parent's g()*/}
};
class mixed /* I don't know how to derive*/ {
virtual void f() { /* call B::f()*/}
virtual void g() { /* call C::g()*/}
};
Я думаю о множественном наследовании здесь. I.e., составляют mixed
, полученные от B
и C
. Но есть некоторые известные проблемы (например, Diamond problem).
Другим решением может быть композиция.
Но что является правильным решением, пожалуйста, сообщите :)
Спасибо заранее!
Если 'A' - это просто интерфейс (т. Е. Он не имеет значимых элементов данных), вы можете просто сделать' mixed' inerherit от 'A', а затем иметь два элемента данных:' B b; 'и' C c; '. Затем в своем 'f()' вы вызываете 'b.f()' и в 'g()' вы вызываете 'c.g()'. Или, возможно, вы можете разделить 'A' на два разных класса: один с' f() 'и один с' g() ', а затем два разных' B '' и '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' , из которого «смешанный» мог наследовать. – Cornstalks