virtual public и просто public
От: Vasiliy_Krasnokutsky Россия  
Дата: 16.09.02 08:04
Оценка:
Доброго времени суток,
Вопрос в следующем, чем отличается виртуальное наследование от обычного наследования.
Я знаю, что если сделать следующее:
class A {public: int x();};
class C: public A {};
class D: public A {};
class E: public C, public D {};
E EObject;
EObject.x(); //Работать не будет ввиду неизвестности какой код вызывать C::x() или D::x()

А если наследовать виртуально, то предок будет считаться одним и все будет работать. Но вот зачем это нужно и где применяется то и другое наследование ???
Re: virtual public и просто public
От: Patalog Россия  
Дата: 16.09.02 08:40
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

[]

А чтоб не было дублирования данных — членов класса.
Почетный кавалер ордена Совка.
Re: virtual public и просто public
От: Gi Россия  
Дата: 16.09.02 09:02
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Доброго времени суток,

VK>Вопрос в следующем, чем отличается виртуальное наследование от обычного наследования.

При виртуальном наследовании в объект класса помещается не сам объект базового класса, а указатель на него, сам подобъект обычно размещается рядом, таким образом если класс два раза виртуально наследует один базовый класс, то в объекте будет два указателя и один подобъект базового класса.
Re[2]: virtual public и просто public
От: Vasiliy_Krasnokutsky Россия  
Дата: 16.09.02 09:10
Оценка:
Здравствуйте Gi, Вы писали:

Gi>При виртуальном наследовании в объект класса помещается не сам объект базового класса, а указатель на него, сам подобъект обычно размещается рядом, таким образом если класс два раза виртуально наследует один базовый класс, то в объекте будет два указателя и один подобъект базового класса.


А зачем тогда нужно не виртуальное множественное наследование ????
Ведь его можно было сделать виртуальным ?
Re[3]: virtual public и просто public
От: Gi Россия  
Дата: 16.09.02 09:15
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

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


Gi>>При виртуальном наследовании в объект класса помещается не сам объект базового класса, а указатель на него, сам подобъект обычно размещается рядом, таким образом если класс два раза виртуально наследует один базовый класс, то в объекте будет два указателя и один подобъект базового класса.


VK>А зачем тогда нужно не виртуальное множественное наследование ????

VK>Ведь его можно было сделать виртуальным ?

Ну во первых это не всегда нужно, а во-вторых при виртуальном наследовании доступ к подобъекту базового класса происходит через указатель что естественно медленее.
Re[4]: virtual public и просто public
От: Vasiliy_Krasnokutsky Россия  
Дата: 16.09.02 09:37
Оценка:
Здравствуйте Gi,
Скорректирую вопрос с учетом ваших ответов
Как храняться объекты на низком уровне ?
Как при этом храниться наследованный обычным образом объект и виртуальным ?
Re[5]: virtual public и просто public
От: Анатолий СССР  
Дата: 16.09.02 09:59
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Здравствуйте Gi,

VK>Скорректирую вопрос с учетом ваших ответов
VK>Как храняться объекты на низком уровне ?
VK>Как при этом храниться наследованный обычным образом объект и виртуальным ?

См. http://www.rsdn.ru/forum/Message.aspx?mid=97557
Автор: Amor
Дата: 09.09.02
Re[5]: virtual public и просто public
От: Gi Россия  
Дата: 16.09.02 10:03
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Здравствуйте Gi,

VK>Скорректирую вопрос с учетом ваших ответов
VK>Как храняться объекты на низком уровне ?
VK>Как при этом храниться наследованный обычным образом объект и виртуальным ?



class A{...};
class B : public A {...};
class C : public A, public B {...};




Объект С
...подобъект А
......данные А
...подобъект В
......подобъект А
.........данные А
......данные В
...данные С

class A{...};
class B : virtual public A {...};
class C : virtual public A, public B {...};


Объект С
...указатель на подобъект А
...подобъект В
......указатель на подобъект А
......данные В
...данные С
...подобъект А
......данные А
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.