На практике я, вероятно, выбрал бы решение shared_ptr, упомянутое выше. Но вот еще один способ, который не часто рассматривается в литературе по C ++, такой, какой вы можете найти в вопросе об интервью или тесте BrainBench:
struct D{
D(int val);
void foo();
};
struct C:private virtual D{
void bar(){
foo();
}
};
struct B:private C,private virtual D{
void car(){
foo();
}
};
struct A:private B,private virtual D{
A(int val):D(val){}
void aar(){
car();
foo();
}
};
частное наследование реализует отношение has-a, подобно тому, как делает его членом. Разница лишь в том, что вы можете иметь только один из каждого типа. В этом случае один и тот же объект D является общим для всех классов композиции.
Но если вы хотите, чтобы другие могли понять, что вы делаете, перейдите к shared_ptrs.