2013-09-11 6 views
2

Стандарт C++ 11 обеспечивает способ наследования конструкторов из базового класса. Мой вопрос касается более ранних стандартов. Предположим, что я наследую конструкторы следующим образом:Конструкторы Inhereting в C++

class Base { 

public: 
    Base() {}; 
    Base(int b) { a = ++b;} 
    virtual int foo() {return 0;} 
    int a; 

}; 

class A : public virtual Base { 

public: 
    A() {} 
    A(int b): Base(b) {} 
    int foo() {return a*a;} 

}; 

class C : public A { 
public: 
    C() {} 
    C(int b): A(b) {} 
    int foo() { return (a*a + a);} 

}; 

Обратите внимание, что у меня есть виртуальное наследование класса Base. Теперь, когда я пытаюсь инициализировать указатель на объект типа C, вместо того, чтобы вызывать конструктор Base (b), код заканчивается вызовом конструктора Base(). Вот главная функция, которую я использовал:

int main(){ 

    C *c = new C(5); 
    std::cout << c->Base::a << std::endl; 
} 

Выходное значение «а» равно 0. Однако, когда я удалить ключевое слово в то время как виртуальное наследование базового класса, то база (б) конструктор вызывается и Значение «а» равно 6. Может ли кто-нибудь помочь мне понять, что происходит? Почему это происходит при создании виртуального наследования по умолчанию?

+0

Спасибо Juanchopanza. Да, эта тема действительно одна и та же. – SvSharma

ответ

6

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

В вашем случае, когда вы создаете экземпляр C, его Base субобъект будет инициализирован на основе списка член-Инициализатора в конструкторе C «s; и поскольку Base там не указан, он будет инициализирован по умолчанию.

Если вы создавали экземпляр A, то действительно был бы использован список участников-инициализаторов A.

Так вызвать Base конструктор, который вы хотите, вы должны были бы изменить конструктор C «s, как это:

C(int b): A(b), Base(b) {} 
Смежные вопросы