множественное наследование в с++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
alina45
Сообщения: 1
Зарегистрирован: 29 янв 2014, 15:07

особенности выполнения конструкторов и деструкторов базовых классов при множественноем наследовании,можети обьяснить пожалуйста,лучше и теорию тоже,зарание спасибо
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Конструкторы базовых классов вызываются в конструкторе наследника в списке инициализации. Вызываны они будут в том порядке, в котором перечислены. Никаких других особенностей вспомнить не могу, если не погружаться в такие пучины, как отлов исключений, брошенных из конструктора базового класса и особой темы с ромбовидным наследованием, но боюсь, это слишком глубокие детали, которые не будут интересны топистартеру.

Вот пример кода. Тут у нас два класса A1, А2 и породжённый от них класс B. Следует отдельно отметить, что конструкторы A1 и A2 инициализируют каждый своё поле, а в конструкторе B мы не напрямую инициализируем поля m_а1, m_а2 (хотя, строго говоря, компилятор нам этого не запретит), а вызываем для этого соответствующие конструкторы. Это правило хорошего тона и делать по-другому считается просто непрофессионально. Наверное, это простое правило можно тоже зачесть, как "особенность".

Код: Выделить всё

#include <iostream>

class A1
{
public:
   A1(int a1) : m_a1(a1)
   {
      std::cout << "A1 constructor called. Member m_a1 set to " << m_a1 << std::endl;
   }

protected:
   int m_a1;
};

class A2
{
public:
   A2(int a2) : m_a2(a2)
   {
      std::cout << "A2 constructor called. Member m_a2 set to " << m_a2 << std::endl;
   }
protected:
   int m_a2;
};

class B : public A1, public A2
{
public:
   B(int a1, int a2, int b): A1(a1), A2(a2), m_b(b)
   {
      std::cout << "B constructor called. Member m_b set to " << m_b << std::endl;
   }
protected:
   int m_b;
};

int main()
{
   B obj(1, 2, 3);
   return 0;
}
После компиляции и запуска такой программы мы увидим следующее:
A1 constructor called. Member m_a1 set to 1
A2 constructor called. Member m_a2 set to 2
B constructor called. Member m_b set to 3
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить