Рассмотрим приведенный ниже код. И g++, и clang++ жалуются (правильно), что конструктор A(int)
является приватным в классе D
. Обратите внимание, что поскольку A
является виртуальным базовым классом D
, A
должен быть инициализирован в mem-инициализаторе класса D
, наиболее производном классе, согласно § 12.6.2/7 в С++ 11. См. живой пример.
class A {
public:
A(int i) : x(i) { }
A() : x(1) {}
int x;
};
class B : private virtual A {
protected:
B(int i) : A(i) { } };
class C : public B, private virtual A {
protected:
C(int i) : A(i), B(i) { }
};
class D : public C {
public:
D() : A(1), C(3) { }
};
int main() {
D d;
}
Но оба компилятора не утруждают себя тем фактом, что конструктор по умолчанию для класса A
также является private в D
, то есть как компилировать, так и выполнять код обычно, если мы определяем конструктор для D
как следует:
D() : C(3) {}
И это неправильно, насколько я могу судить.
Обратите внимание, что оба компилятора не могут скомпилировать (правильно), если мы определим:
D() : A(), C(3) {}