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

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

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

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

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

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

class B : public virtual A {};

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

А здесь как?

Спасибо.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2008, 13:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос О виртуальном наследовании (C++):

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

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

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

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

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

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

4
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
0
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 {}; ???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2008, 11:47
Привет! Вот еще темы с ответами:

Ошибка при наследовании - C++
Подскажите пожалуйста почему наследование класса readwrite не работает? //Программа считывает данные из файла и строит графики ...

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

Конструкторы при наследовании - C++
Добрый вечер. Пишу программу с наследованием классов. Класс-родитель - nasled, производный от него - steck. Когда пытаюсь вызвать...

Ошибка при наследовании? - C++
Программа компилируется, но консоль не выдает информацию. Связано ли это как то с переполнением буфера? Программа небольшая укажите...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
06.11.2008, 11:47
Ответ Создать тему
Опции темы

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