Re[3]: Наследование, вызов конструктора базового класса
От: blacksun  
Дата: 11.06.11 19:59
Оценка:
Здравствуйте, blacksun, Вы писали:

B>Здравствуйте, 24, Вы писали:


24>>Здравствуйте, blacksun, Вы писали:


B>>>B()

B>>>{
B>>> m_x = 555;
B>>> A(777); // <--- Что происходит здесь? Почему не изменяется A::m_x, а изменятся какой-то другой m_x с другим адресом
B>>> //A::m_x = 888; // Здесь все ок
B>>>}

24>>Потому что это не вызов конструктора, а создание безымянного объекта типа А. Чтоб вызывался конструктор, нужно проинициализировать базовую часть:


24>>
24>>B() : A(777)
24>>{
24>>   ...
24>>}
24>>


B>Вот спасибо, теперь понятно.

B>А все же, может есть способ явно вызвать конструктор A() и из кода конструктора B() ? Например когда инициализировать A хочется не константой?

Понятно, что можно сделать как-то так:

class A
{
protected:
    int m_x;
public:

    A()
    {
        m_x = 111;
    }
    A(int i)
    {
        m_x = i;
    }

    void init()
    {
        m_x = 999;
    }
};

class B : public A
{
public:
    int m_x;
public:
    B()
    {
        m_x = 555;
        //A::m_x = 888;
        init();
    }
};



Но как насчет вызова конструктора? В чем его отличие от init() ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.