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

Не могу понять виртуальное наследование - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Каков алгоритм программы? http://www.cyberforum.ru/cpp-beginners/thread966782.html
Даны произвольные числа a b c.Написать программу,которая проверяла бы,можно ли построить треугольник с такими длинами сторон, и если можно, то определить вид треугольника по соотношению сторон...
C++ Напишите программу для расчета по двум формулам Напишите программу для расчета по двум формулам. Предварительно подготовьте текстовые примеры по второй формуле с помощью калькулятора (результат по первой формуле должен совпадать со второй). Для... http://www.cyberforum.ru/cpp-beginners/thread966769.html
C++ Исправить ошибки в коде
Помогите исправить ошибки(( #include <fstream> #include <iostream> #include <string.h> #include <cstdio> #include <cstdlib> #define n 10 using namespace std; struct scan { char model;...
C++ Вылетает программа, укажите ошибку
Программа вылетает. Помогите пожалуйста. Условие программы: В программе используется класс good_time и перегрузка оператора сложения. Время задается как строка символов вида ЧЧ@ММ@СС, где @ -...
C++ Как объект записать в файл? http://www.cyberforum.ru/cpp-beginners/thread966763.html
Подскажите пожалуста как объект abbonent записать в файл #include "stdafx.h" #include"Name.h" #include"phone_book.h" int _tmain(int argc, _TCHAR* argv) {
C++ чтение данных из открытого файла (fread) if (_wfopen_s(&f, file_name, L"rtS, ccs=UTF-8") == 0){ fread((void*)rf, sizeof(wchar_t), 512, f); fclose(f); _wremove(file_name); ... подробнее

Показать сообщение отдельно
IO8
0 / 0 / 0
Регистрация: 01.10.2013
Сообщений: 3
01.10.2013, 22:19  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class A
{
    int a;
public:
    void foo(){ a = 0;};
};
 
class B1 : virtual public A
{ 
    int b1;
};
 
class B2 : virtual public A
{
    int b2;
};
class C : public B1, public B2
{
    int c;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    С c;
    c.foo();
 
    return 0;
}


Теперь вызов c.foo() не вызывает никаких проблем, т.к. компилятор автоматически выполняет все необходимые преобразования для приведения типов. Сейчас в иерархии находится только один подобъект класса A, поэтому конфликта не возникает.

Реализация таблицы виртуальных классов (ТВК) никак не регламентируется и лежит на совести разработчиков компилятора. Я для примера разберу, что делает компилятор MS VC++ 2003 .NET, чтобы вы лучше понимали что происходит.

Итак, будем рассматривать классы из предыдущих примеров. При создании класса C компилятор формирует в памяти следующие структуры:



Таблицы виртуальных классов содержат смещения относительно начала класса для доступа к полям класса А. Так ТВК для B1 содержит смещение 0x18 (24) относительно начала класса B1 для доступа к полям класса A. Обратите внимание, что первый элемент ТВК содержит нулевое смещение. Очевидно, что это смещение для доступа к собственным полям. ТВК для B2 содержит уже другое смещение, т.к. его позиция в пределах всего класса C уже другая. ТВК, как и таблицы виртуальных функций, распределяются статически. Т.е. одна копия таблицы используется всеми классами типа C.




Почему Таблица Виртуальных Классов содержит эти значения? Объясните. А то вообще не разберусь с этой темой
0
Миниатюры
Не могу понять виртуальное наследование  
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru