2015-10-06 2 views
2

В поисках объяснения какого-либо факта в стандарте я нашел это:Виртуальная база инициализации класса

Абстрактный класс (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-инициализаторе. Это то, что они означают?

+0

(пересмотр моего комментария) Да, я думаю, вы поняли это правильно: 'A (int)' пропускает инициализацию 'B', даже если вы использовали' B (a) 'в ctor-initializer. В конце концов для его инициализации вызывается конструктор по умолчанию 'B'. (P.S. Вы хотите 'virtual ~ B() {}'.) – crayzeewulf

+1

[This] (http://stackoverflow.com/a/25397512/1062948) ответ должен быть уместным здесь. – crayzeewulf

ответ

1

В этом примере D является самым производным классом и будет строить B с использованием конструктора по умолчанию (без параметров).

Абсолютный класс никогда не является самым производным, потому что вы должны извлечь его из него, чтобы создать его.

Смежные вопросы