Виртуальное наследование в С++
Если я ничего не забыл, то единственное. Название такое - чтобы не делать нового зарезервированного слова (и не ломать старый код).
(и не ломать старый код)А это как? В смысле - исторически повелось, что ли?
Добавил новое ключевое слово - перестал компилироваться код, который его использовал как идентификатор.
В частности, поэтому в C++ throw, а не raise (потому что raise есть в signal.h). В заголовках функций для перечисления кидаемых исключений - тоже throw, а не throws (как в Java). Ну и некоторые другие приколы.
Вообще, почитай "Дизайн и эволюция C++". Классная книжка.
ну и ещё вроде бы на порядок вызова конктрукторов/деструкторов влияет
ну и ещё вроде бы на порядок вызова конктрукторов/деструкторов влияетвлияние очевидно. если есть не 2 объекта самого базового класса, а 1, то и конструктор, и деструктор надо вызывать 1 раз, а не 2
#include <iostream>
using namespace std;
struct A
{
A
{
cout << "A::A" << endl;
}
};
struct B
{
B
{
cout << "B::B" << endl;
}
};
struct C : B, A
{
C
{
cout << "C::C" << endl;
}
};
struct D : B, virtual A
{
D
{
cout << "D::D" << endl;
}
};
void main
{
C c;
D d;
}
B::B
A::A
C::C
A::A
B::B
D::D
B::Bэто стандартизовано или зависит от реализации?
A::A
C::C
A::A
B::B
D::D
это стандартизовано или зависит от реализации?стандарт ISO 14882:1998, 12.6.2, параграф 5
более нового стандарта у меня нет
Оставить комментарий
Retor
Вопрос буквоедческий.От обыкновенного (судя по Штрауструпу) отличается только тем, что соответствующие дочерние классы с виртуальным наследованием имеют дело с одним и тем же объектом базового класса.
Это единственное отличие? И если да, то почему название такое странное (не могу найти никаких аналогий с виртуальными функциями)?