Я никогда не использовал множественное наследование и столкнулся с проблемой проектирования, с которой я никогда не сталкивался ..
class A {
//..methods..
}
class B : public A {
int b;
//...methods..
}
class C : public A {
int c1,c2;
}
class D : public B,public C {
}
Вот классический бриллиант. Дело в том, что C
на самом деле просто A
с двумя дополнительными целыми числами. и D
на самом деле представляет собой совокупность B
и C
, но я чувствую, что множественное наследование не было разработано для создания подобных вещей. Или что для этого могут быть другие лучшие практики.
Причина, по которой я пытаюсь реализовать множественное наследование, заключается в том, что я хочу написать функцию типа void func(A*)
и передать ей либо указатель класса A
, либо D
. Моя изобретательная попытка - сделать простое приведение:
void func(A* a) { // <-- I call this with a A or D pointer
// ..do something with A members..
if(is_the_case) { // <-- Im sure the passed "a" pointer is actually a *D
D* d = (D*)a;
// ..do something with the extra 2 ints provided by the C class..
}
}
Не работает .. Компилируется нормально, но у меня действительно странное поведение при выполнении if(is_the_case)
, очищает эти 2 дополнительные целые числа c1
и c2
, очищает также b
(наследуется B
).
Я вспомнил о проблеме алмазов, но здесь есть только один B
(и 2 A
) в иерархии, поэтому я не понимаю, почему очищается также b
. Просто чтобы попробовать, я использовал public virtual в B
и C
декларации. Теперь каждое приведение является ошибкой компиляции, если я не использую dynamic_cast
..
Может кто-то прояснить, что происходит за кулисами? Как лучше всего это делать, учитывая, что есть и другие классы, такие как:
class E : public A {
int e;
//..methods..
}
class F : public E,public C {
}
То есть другие классы, которые являются просто совокупностью классов, производных от A
+ двух дополнительных целочисленных значений, унаследованных от C
, и которые могут быть переданы в функцию, которая принимает *A
Спасибо, я сделал все возможное, чтобы быть как можно яснее ..