В поисках объяснения какого-либо факта в стандарте я нашел это:Виртуальная база инициализации класса
Абстрактный класс (10,4) никогда не является наиболее производный класс, таким образом, его конструкторы никогда не инициализировать виртуальные классы базы, поэтому могут быть опущены соответствующие mem-инициализаторы .
Это из параграфа 12.6.2
окончательного рабочего проекта. Поскольку он встроен в Примечание, и ни один пример не предоставлен, я не знаю, как его следует лечить. Итак, я попробовал пример:
#include <iostream>
struct B{
~B(){}
B(){ std::cout << "B()" << std::endl; }
B(int){ std::cout << "B(int)" << std::endl; }
};
struct A : virtual B
{
int s;
virtual void foo() = 0;
A(int a) : B(a) { std::cout << "A(int)" << std::endl; }
};
struct D : A{
D() : A(10){ }
virtual void foo(){ }
} d;
int main()
{
}
и получил выход
B()
A(int)
http://coliru.stacked-crooked.com/a/b16c68226f072ced
, несмотря на указания конструкторе B
«s в CTOR-инициализаторе. Это то, что они означают?
(пересмотр моего комментария) Да, я думаю, вы поняли это правильно: 'A (int)' пропускает инициализацию 'B', даже если вы использовали' B (a) 'в ctor-initializer. В конце концов для его инициализации вызывается конструктор по умолчанию 'B'. (P.S. Вы хотите 'virtual ~ B() {}'.) – crayzeewulf
[This] (http://stackoverflow.com/a/25397512/1062948) ответ должен быть уместным здесь. – crayzeewulf