Виртуальное наследование в С++

Retor

Вопрос буквоедческий.
От обыкновенного (судя по Штрауструпу) отличается только тем, что соответствующие дочерние классы с виртуальным наследованием имеют дело с одним и тем же объектом базового класса.
Это единственное отличие? И если да, то почему название такое странное (не могу найти никаких аналогий с виртуальными функциями)?

oliver11

Если я ничего не забыл, то единственное. Название такое - чтобы не делать нового зарезервированного слова (и не ломать старый код).

Retor

Спасибо, понял :)
(и не ломать старый код)
А это как? В смысле - исторически повелось, что ли?

oliver11

Чуть ли не главное правило при проектировании C++ - сохранить максимальную совместимость с C (и со старыми версиями C++).
Добавил новое ключевое слово - перестал компилироваться код, который его использовал как идентификатор.
В частности, поэтому в C++ throw, а не raise (потому что raise есть в signal.h). В заголовках функций для перечисления кидаемых исключений - тоже throw, а не throws (как в Java). Ну и некоторые другие приколы.
Вообще, почитай "Дизайн и эволюция C++". Классная книжка.

freezer

ну и ещё вроде бы на порядок вызова конктрукторов/деструкторов влияет

klyv

ну и ещё вроде бы на порядок вызова конктрукторов/деструкторов влияет
влияние очевидно. если есть не 2 объекта самого базового класса, а 1, то и конструктор, и деструктор надо вызывать 1 раз, а не 2 ;)

freezer

я имел в виду вот что:

#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

klyv

B::B
A::A
C::C
A::A
B::B
D::D
это стандартизовано или зависит от реализации?

freezer

это стандартизовано или зависит от реализации?
стандарт ISO 14882:1998, 12.6.2, параграф 5
более нового стандарта у меня нет
Оставить комментарий
Имя или ник:
Комментарий: