Рассмотрим приведенный ниже код. И g ++, и clang ++ жалуются (правильно), что конструктор A(int)
является приватным в классе D
. Обратите внимание, что поскольку A
является виртуальным базовым классом D
, A
должен быть инициализирован в mem-initializer класса D
, который является самым производным классом, согласно §12.6.2/7 в C++ 11. См. live example.Неявно вызов конструктора недоступного виртуального базового класса
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) {}' –
@RSahu Даже для случая 'D(): C (3) {}' указал выше ? Я спрашиваю об этом, потому что я действительно не знаю разницы между компилятором, который я использовал в Coliru (стандартный std = C++ 11) и 4.7.3, который вы упомянули выше – Belloc
@RSahu С 'D(): C (3) ', я не получаю ошибки в GCC 4.7.4. Какие параметры командной строки вы используете с 4.7.3, чтобы получить ошибку? – hvd