множественное наследование в с++
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
особенности выполнения конструкторов и деструкторов базовых классов при множественноем наследовании,можети обьяснить пожалуйста,лучше и теорию тоже,зарание спасибо
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Конструкторы базовых классов вызываются в конструкторе наследника в списке инициализации. Вызываны они будут в том порядке, в котором перечислены. Никаких других особенностей вспомнить не могу, если не погружаться в такие пучины, как отлов исключений, брошенных из конструктора базового класса и особой темы с ромбовидным наследованием, но боюсь, это слишком глубокие детали, которые не будут интересны топистартеру.
Вот пример кода. Тут у нас два класса A1, А2 и породжённый от них класс B. Следует отдельно отметить, что конструкторы A1 и A2 инициализируют каждый своё поле, а в конструкторе B мы не напрямую инициализируем поля m_а1, m_а2 (хотя, строго говоря, компилятор нам этого не запретит), а вызываем для этого соответствующие конструкторы. Это правило хорошего тона и делать по-другому считается просто непрофессионально. Наверное, это простое правило можно тоже зачесть, как "особенность".
После компиляции и запуска такой программы мы увидим следующее:
Вот пример кода. Тут у нас два класса 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.