Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Вениамин
Сообщений: n/a
#1

О виртуальном наследовании - C++

04.11.2008, 13:46. Просмотров 813. Ответов 4
Метки нет (Все метки)

Хотелось бы с Вашей помощью разобраться в деталях виртуального наследования.
Вопрос такой: что на физическом уровне означает выражение

class B : public virtual A {};

Вот с виртуальными функциями все вроде ясно: к объекту добавляется еще 4 байта, которые содержат указатель на виртуальную таблицу класса, которая, в свою очередь, содержит адреса виртуальных функций.

А здесь как?

Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2008, 13:46     О виртуальном наследовании
Посмотрите здесь:

Почему при виртуальном наследовании компилятор не знает о иерархии? - C++
Рассмотрим пример: class Base { virtual void foo()=0; }; class Derv :public Base { foo(){}

Вопросец о виртуальном конструкторе копировщике. - C++
Здравствуйте, все. Вопрос плана такого: Читаю, значит, книжку. Дочитал до виртуальных методов. И дошел до главы с названием"...

Как перегрузить оператор в виртуальном классе - C++
Помогите пожалста разобраться с перегрузкой операторов в абстрактных классах!!!! Есть чисто виртуальный класс физических величин ...

Ошибка в наследовании - C++
Появилась проблема в наследовании с использованием виртуальных методов. Если записать код вот так, присваивая значения переменным не в...

не до понимание в наследовании - C++
у нас есть допустим 2 класса. Один circle, другой Point. Circle наследует от Point. Тоесть Point базовый класс а Circle производный. ...

Ошибка в наследовании - C++
Всем привет. Есть такой код: #include <iostream> using namespace std; class A { public : A(){}

функции с исключениями в наследовании - C++
почему на такоеstruct B { class S {}; class SS :public S {}; virtual void f()throw(SS) { throw SS(); } }; struct C : public...

Ромб в множественном наследовании - C++
Добрый день ! Не помню как устранить проблему ромба в множественном наследовании. Вроде нужно втулить куда-то слово виртуал 2...

Присвоение при наследовании - C++
Всем доброго дня ! Подскажите пожалуйста как сделать так , что-бы при выполнении операции a = c; вызывались операторы = обеих ...

Сравнение при наследовании - C++
Есть базовый класс, пусть его зовут А, а у него есть 4 потомка. Пусть их зовут: B, C, D и E. Базовый класса абстрактный,в нём есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ManiaK
Сообщений: n/a
04.11.2008, 17:58     О виртуальном наследовании #2
Ну ты загнул!)
Andir
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 145
05.11.2008, 04:26     О виртуальном наследовании #3
Привет!

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

ссылочка по теме в MSDN на VS.NET
ms-help://MS.VSCC/MS.MSDNVS/vclang/html/_pluslang_virtual_base_classes.htm
и аналог в инете:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_Virtual_Base_Classes.asp
ManiaK
Сообщений: n/a
05.11.2008, 15:44     О виртуальном наследовании #4
Или в 'Язык програмирования C++ Специальное издание' Бьярна Страуструпа
Вениамин
Сообщений: n/a
06.11.2008, 11:47     О виртуальном наследовании #5
Ну да, это я знаю. Если у нас есть следующее:
class A{};
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
то при создании объекта класса D, будет создан один экземляр класса A, в отличие от не виртуального наследования.
Но вот вопрос: а если к примеру класс C наследует А не виртуально, т.е.
class C : public A {};
Что тогда будет при создании объекта класса D???

Поэтому мне интересно узнать как компилятор все это представляет?
Вот если мы пишем:
class B : public virtual A{};
в объект класса B добавляется какая-то информация размером в 4 байта??? какая? Если в А есть виртуальная функция, то эта информация уже 8 байт???
Вот про те же виртуальные функции: если в классе есть хоть одна виртуальная функция, к объекту класса добавляется 4 байта - указатель на таблицу виртуальных функций - и от сюда уже понятно как раелизуется полиморфизм.
А что значит: class B : public virtual A {}; ???
Yandex
Объявления
06.11.2008, 11:47     О виртуальном наследовании
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru