Доброго времени суток,
Вопрос в следующем, чем отличается виртуальное наследование от обычного наследования.
Я знаю, что если сделать следующее:
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()
А если наследовать виртуально, то предок будет считаться одним и все будет работать. Но вот зачем это нужно и где применяется то и другое наследование ???
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Доброго времени суток, VK>Вопрос в следующем, чем отличается виртуальное наследование от обычного наследования.
При виртуальном наследовании в объект класса помещается не сам объект базового класса, а указатель на него, сам подобъект обычно размещается рядом, таким образом если класс два раза виртуально наследует один базовый класс, то в объекте будет два указателя и один подобъект базового класса.
Здравствуйте Gi, Вы писали:
Gi>При виртуальном наследовании в объект класса помещается не сам объект базового класса, а указатель на него, сам подобъект обычно размещается рядом, таким образом если класс два раза виртуально наследует один базовый класс, то в объекте будет два указателя и один подобъект базового класса.
А зачем тогда нужно не виртуальное множественное наследование ????
Ведь его можно было сделать виртуальным ?
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте Gi, Вы писали:
Gi>>При виртуальном наследовании в объект класса помещается не сам объект базового класса, а указатель на него, сам подобъект обычно размещается рядом, таким образом если класс два раза виртуально наследует один базовый класс, то в объекте будет два указателя и один подобъект базового класса.
VK>А зачем тогда нужно не виртуальное множественное наследование ???? VK>Ведь его можно было сделать виртуальным ?
Ну во первых это не всегда нужно, а во-вторых при виртуальном наследовании доступ к подобъекту базового класса происходит через указатель что естественно медленее.
Здравствуйте Gi,
Скорректирую вопрос с учетом ваших ответов
Как храняться объекты на низком уровне ?
Как при этом храниться наследованный обычным образом объект и виртуальным ?
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте Gi, VK>Скорректирую вопрос с учетом ваших ответов VK>Как храняться объекты на низком уровне ? VK>Как при этом храниться наследованный обычным образом объект и виртуальным ?
Здравствуйте 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 {...};
Объект С
...указатель на подобъект А
...подобъект В
......указатель на подобъект А
......данные В
...данные С
...подобъект А
......данные А