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

Считывание класса с виртуальным наследованием из бинарного файла - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Дан первый элемент последовательности и рекуррентная формула. Определить, сколько элементов... http://www.cyberforum.ru/cpp-beginners/thread532993.html
Написать на С+. Дан первый элемент последовательности a0=7 и рекуррентная формула a(i+1)=ai/(i+1)+i/ai . Определить, сколько элементов этой последовательности меньше введенного с клавиатуры значения.
C++ Указатели на указатели Есть указатель на тип int. Нужно написать функцию, которая бы принимала адрес этого указателя и присваивала ему адрес нового массива созданного внутри функции. Код: #include <stdio.h> #include <stdlib.h> #include <locale> void initArray(int**array_, int*m_size) { printf("Введите размер массива\n >> "); scanf("%d", &(*m_size)); http://www.cyberforum.ru/cpp-beginners/thread532980.html
вывод матрицы C++
почему выводит вместо одной матрицы пять штук? #include<stdio.h> #include<stdlib.h> #include<time.h> #include<iostream.h> #define m 7 #define n 5
Дано расстояние в сантиметрах.Найти число полных метров в нем C++
Дано расстояние в сантиметрах.Найти число полных метров в нем. Дублирование тем нарушает правила форума. Не делайте так больше!
C++ Заполнение массива и создание матрицы. http://www.cyberforum.ru/cpp-beginners/thread532932.html
Доброго времени суток. Формально я решаю задачу аппроксимации набора точек полиномом методом наименьших квадратов, но помощь мне нужна только в заполнении массивов и корректного создания матрицы для последующего применения метода гаусса. 1.Помогите создать массив, заполненный 10 элементами, не целыми. Просто как его задать в Visual C. 2.Создать матрицу, заполненную элементами x в...
C++ WinAPI основы Нужна элементарная синхронизация с помощью событий. что я делаю не так? #include "stdafx.h" #include <Windows.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; подробнее

Показать сообщение отдельно
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
28.03.2012, 17:33     Считывание класса с виртуальным наследованием из бинарного файла
Рассмотрим простой пример. Допустим есть класс А, и производный от него класс В. Наследование виртуальное (обязательно). Создадим объект класса В и запишем в бинарный файл. Сразу же считаем, выводим на экран - всё работает. Выходим из программы, снова заходим, считываем, пытаемся вывести на экран и получаем ошибку. Без виртуального наследования (с обыкновенным наследованием) ошибки не возникает. Ошибка на скринах. Код программы-примера:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <fstream>
#include <conio.h>
 
using namespace std;
 
class A
{
protected:
    int a;
public:
    A(int _a): a(_a) {}
};
 
 
class B: public virtual A
{
    int b;
public:
    B(int _a, int _b): A(_a), b(_b) {}
    void Show()
    {
        cout<<a<<" "<<b;
    }
};
    
int main()
{
    fstream iof("file",ios::in | ios::out | ios::binary);
    if( !iof.is_open() )
    {
        iof.clear();
        iof.open("file",ios::in | ios::out | ios::binary | ios::trunc);
    }
    
    B obj(1,1);
    char choice;
    while(true)
    {
        cout<<"\n1)Write"
            <<"\n2)Read"
            <<"\n3)Exit";
        choice=_getch();
        switch(choice)
        {
        case '1':
            iof.seekp(0,ios::end);
            iof.write(reinterpret_cast<char*>(&obj), sizeof(obj));
            break;
        case '2':
            iof.read(reinterpret_cast<char*>(&obj),sizeof(obj));
            cout<<"\nis Read: ";
            obj.Show();
            break;
        case '3':
            return 0;
        }
    }
}
Последовательность действий для получения ошибки:
1)Запускаем прогу
2)Выбираем 1 - Write
3)Выходим 3 - exit
4)Запускаем прогу
5)Выбираем 2 - Read

Кстати класс с виртуальным наследованием почему-то на 4 байта тяжелее, чем без него.
Может кто знает как исправить ошибку не убирая виртуальное наследование?
Миниатюры
Считывание класса с виртуальным наследованием из бинарного файла   Считывание класса с виртуальным наследованием из бинарного файла  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru