Странная проблема возникла, когда я попытался «решить» обычную проблему с бриллиантами обычным способом - используя виртуальное наследование:
A
/ \* both virtual
B C
\ /
D
Однако в моем базовом классе A нет конструктора по умолчанию, поэтому я должен былвызовите его вручную из D. Однако, когда я пытаюсь добавить класс E в этот алмаз как наследуемый C
A
/ \* both virtual
B C
\ / \
D E
, все равно необходимо вручную вызвать конструктор A в конструкторе E, т. е. C нечто создать A из E, даже если не существует ни множественного наследования, ни алмазного ACE.
class A
{public:
A (int _N): N(_N) {};
void show()
{cout<<"A"<<N;}
protected:
int N;
};
class B: public virtual A
{ public:
B(int n): A(2*n) {};
void show()
{ cout<<"B"<<N;}
};
class C: public virtual A
{ public:
C(int n): A(3*n) {};
void show()
{ cout<<"C"<<N;}
};
class D: public B,C
{ public:
D(): B(1), C(2), A(3) {};
void show()
{ cout<<"D"<<N;}
};
class E: public virtual C
{ public:
E(): C(1) {};
void show()
{ cout<<"E"<<N;}
};
int main()
{D d; // OK
A *a = &d;
a->show();
E e; // NOT OK, no function A::A() to call in E::E()
A *a2 = &e;
a2->show();
return 0;
}
Возможно ли решить эту проблему без вызова конструктора A из E?Мне нужен C, чтобы сделать это правильно :-).
Или можно вообще не пытаться решить проблему с алмазом:
A A
| | no virtual at all
B C
\ / \
D E
и все же пытаться объявить объект класса D с двумя экземплярами A, но сказать компилятору использовать A изС когда коллирует с D каждый раз?Когда я пытаюсь добавить
using C::A
в объявление D, оно все равно выдает ошибку однозначного основания A.