виртуальное наследование может делать то, что вы хотите:
#include <iostream>
class Bar
{
size_t len_;
public:
Bar(size_t len) : len_(len) {std::cout << len << '\n';}
};
class Foo : virtual public Bar //virtual inheritance
{
size_t foo_bigger_than_bar;
public:
Foo() : Bar(sizeof(Foo)) { } //Bar only called if Foo is most derived
};
class Derived2: public Foo
{
size_t derived2_bigger_than_foo;
public:
Derived2() : Bar(sizeof(Derived2)), Foo() { }
// since Foo virtually derives from Bar, we have (get) to
// initialize Bar ourselves.
};
int main() {
Foo f;
std::cout << '\n';
Derived2 d;
}
Виртуальный базовый класс инициализируется только самым производным классом.Например, при создании Derived2
конструктор Foo
будет не конструировать объект Bar, поскольку Derived2
уже построил его.Это ключ к наследованию бриллиантов, например std::fstream
.
Демо здесь: http://codepad.org/HUlLB4Uq