Рассмотрим код ниже. И g++, и clang++ жалуются (правильно), что конструктор A(int)
является закрытым в классе D
. Обратите внимание, что, поскольку A
является виртуальным базовым классом D
, A
должен быть инициализирован в mem-initializer класса D
, наиболее производного класса, в соответствии с §12.6.2/7 в C+. +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
также является приватным в D
, т.е. и компилирует, и выполняет код нормально, если мы определим конструктор для D
следующим образом:
D() : C(3) {}
И это неправильно, насколько я могу судить.
Обратите внимание, что оба компилятора не смогут скомпилировать (правильно), если мы определим:
D() : A(), C(3) {}
D() : C(3) {}
- person Shafik Yaghmour   schedule 27.02.2015D(): C(3) {}
, указанного выше? Я спрашиваю об этом, потому что я действительно не знаю разницы между компилятором, который я использовал в Coliru (стандартный std=C++11), и 4.7.3, о котором вы упоминали выше. - person Belloc   schedule 27.02.2015D() : C(3)
я не получаю ошибок с GCC 4.7.4. Какие параметры командной строки вы используете с 4.7.3, чтобы получить ошибку? - person   schedule 27.02.2015error: 'class A A::A' is inaccessible
на ideone: ideone.com/n9ywWo - person drescherjm   schedule 27.02.2015D() : A(1), C(3) {}
... для меня это абсолютно бессмысленно. - person wolfPack88   schedule 27.02.2015