Разгледайте кода по-долу. И 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