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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Каков алгоритм программы? http://www.cyberforum.ru/cpp-beginners/thread966782.html
Даны произвольные числа a b c.Написать программу,которая проверяла бы,можно ли построить треугольник с такими длинами сторон, и если можно, то определить вид треугольника по соотношению сторон (равносторонний, равнобедренный, разносторонний) и по соотношению углов( остроугольный ,прямоугольный, тупоугольный). По результатам проверки вывести на экран соответствующее сообщение. #include...
C++ Напишите программу для расчета по двум формулам Напишите программу для расчета по двум формулам. Предварительно подготовьте текстовые примеры по второй формуле с помощью калькулятора (результат по первой формуле должен совпадать со второй). Для их использования необходимо подключить к программе заголовочный файл <math.h>. Нужно программировать на С++. Не могу не как разобраться( помогите мальчишки) 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 и перегрузка оператора сложения. Время задается как строка символов вида ЧЧ@ММ@СС, где @ - любой из разделителей: запятая, точка, двоеточие или пробел. Если не заданы секунды (СО, минуты (ММ) или часы (ЧЧ), для них принимается нулевое значение. #include "stdafx.h" #include <iostream>...
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); wprintf_s(rf); подробнее

Показать сообщение отдельно
IO8
0 / 0 / 0
Регистрация: 01.10.2013
Сообщений: 3

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

01.10.2013, 21:49. Просмотров 2935. Ответов 2
Метки (Все метки)

Непонятны несколько моментов. Как строятся таблицы виртуальных классов?

Есть базовый класс, У него два предка. А еще есть третий класс. И в результате получается ромб

C++
1
2
3
4
5
6
7
          C_A
         /   \
        /     \
      C_B1   C_B2
        \     /
         \   /
          C_C



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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// --------------------------------------------------------
// [url]http://devdoc.web-ide.ru/index.php/content/view/virtual_inheritance.htm[/url]
// TBK - Таблица Виртуальных Классов
 
// sizeof = (a) = 4
class C_A
{
private:
    int a;
 
public:
    void foo()  { a=0;  std::cout << "C_A::foo()\n"; }
};
// 4 байта  a
 
// sizeof = (*vtable1 + a + b1) = 4+4+4 = 12
class C_B1 : virtual public C_A
{
private:
    int b1;
};
// TBK:
// 4 байта  0x00000000
// 4 байта  0x00000018 = 24 (почему по этому адресу записано это значение?)
 
// sizeof = (*vtable2 + a + b2) = 4+4+4 = 12
class C_B2 : virtual public C_A
{
private:
    int b2;
};
// TBK:
// 4 байта  0x00000000
// 4 байта  0x00000010
 
// sizeof = (*vtable1+b1) + (*vtable2+b2) + (c) + (a)
// sizeof = (4+4) + (4+4) + (4) + (4) = 8+8+4+4 = 24
class C_C : public C_B1, public C_B2
{
private:
    int c;
};
Почему для класса C_B1 таблица именно такая, Как она вообще создается?
C++
1
2
3
// TBK:
// 4 байта  0x00000000
// 4 байта  0x00000018 = 24 (почему по этому адресу записано это значение?)
Добавлено через 5 минут
И еще вопрос по этой же теме. Почему в этой таблице по нулевому адресу записано 00000000?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru