Конструктор Child в приведенном ниже коде вызывает его родительский конструктор для инициализации. Однако код не будет компилироваться, если только Child не вызовет конструктор Grandparent, даже если это деталь реализации, которая должна быть скрыта в Parent. Я не хочу раскрывать эту деталь пользователям класса Child, так как она может измениться в будущем. Как я могу получить приведенный ниже код?
Я пытался изменить наследование на «частное», но конструктор Child все еще должен был знать об этом частном порядке, который, по-моему, несколько отрицает цель частного наследования!
Есть предложения?
#include <iostream>
class MyObject {
public:
MyObject(int i) {
std::cout << "MyObject(" << i << ") constructor" << std::endl;
}
};
class Grandparent {
public:
Grandparent(MyObject i)
{
};
};
class Parent: virtual public Grandparent {
public:
Parent(int j) :
Grandparent(MyObject(j))
{
};
};
class Child: virtual public Parent {
public:
Child() :
//Grandparent(MyObject(123)), // Won't work without this
Parent(5)
{
};
};
int main(void)
{
Child c;
return 0;
}
$ g++ -o test test.cpp
test.cpp: In constructor ‘Child::Child()’:
test.cpp:29: error: no matching function for call to ‘Grandparent::Grandparent()’
test.cpp:12: note: candidates are: Grandparent::Grandparent(MyObject)
test.cpp:10: note: Grandparent::Grandparent(const Grandparent&)