Należy wziąć pod uwagę poniższy kod. Zarówno g ++, jak i clang ++ narzekają (poprawnie), że konstruktor A(int)
jest prywatny w klasie D
. Zauważ, że jako A
jest wirtualną klasą podstawową D
, A
należy zainicjować w inicjalizatorze pamięci klasy D
, najbardziej pochodną klasą, zgodnie z §12.6.2/7 w C++ 11. Zobacz live example.Niejawne wywoływanie konstruktora niedostępnej wirtualnej klasy bazowej
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;
}
Ale oba kompilatory nie przejmuj się tym, że konstruktor domyślny dla klasy A
jest także prywatny w D
, czyli zarówno skompilować i wykonać kod normalnie, jeśli definiujemy konstruktor dla D
następująco:
D() : C(3) {}
I to jest złe, o ile mogę powiedzieć.
Zauważ, że oba kompilatory nie skompilować (prawidłowo), jeżeli zdefiniujemy:
D() : A(), C(3) {}
Możesz dodać przykład na żywo, który pokazuje przypadek, w którym jesteś zaintrygowany, np. 'D(): C (3) {}' –
@RSahu Nawet dla przypadku 'D(): C (3) {}' wskazał wyżej ? Pytam o to, ponieważ tak naprawdę nie wiem, jaka jest różnica między kompilatorem, którego użyłem w Coliru (standardowe std = C++ 11) i 4.7.3, o którym wspomniałeś powyżej – Belloc
@RSahu z 'D(): C (3) ', nie otrzymuję błędu z GCC 4.7.4. Które opcje wiersza poleceń używasz z 4.7.3, aby uzyskać błąd? – hvd