@ashot_powershot

Почему пишет ошибка при чтении данных?

#include<iostream>
#include<cstdlib>
#include<cmath>
#include<conio.h>
#include<ctime>
#include <string>
#include<Windows.h>
#include<fstream>

using namespace std;

class student
{
public:
	string family, name, patronymic, address;
	int day, month, year, age;
	student()
	{
	}
	student(string family1, string name1, string patronymic1, string address1, int day1, int month1, int year1, int age1)
	{
		family = family1;
		name = name1;
		patronymic = patronymic1;
		address = address1;
		day = day1;
		month = month1;
		year = year1;
		age = age1;
	}
	friend ostream & operator<<(ostream & os, const student & c)
	{
		cout << c.family << "\t";
		cout << c.name << "\t";
		cout << c.patronymic << "\t";
		cout << c.day << "\t";
		cout << c.month << "\t";
		cout << c.year << "\t";
		cout << c.age << "\t";
		cout << c.address << "\t";
		return os;
	}

};
class schoolboy : public student
{
public:
	string progress;
	int number, clas;
	schoolboy(string progress1, int number1, int clas1)
	{
		progress = progress1;
		number = number1;
		clas = clas1;
	}
	friend ostream & operator<<(ostream & os, const schoolboy & c)
	{
		cout << c.number << "\t";
		cout << c.clas << "\t";
		cout << c.progress << "\t";
		return os;
	}
};
//Создать базовый класс «Учащийся» (ФИО, дата рождения, возраст, адрес проживания)
//и производный класс «Школьник» (номер школы, класс, успеваемость). Тип наследование – открытое. Выполнить:
//1.	В классе должна быть переопределена функция - операция вывода на экран информации о школьниках.
//2.	В программе - тестере продемонстрировать использование всех функций и операций.
//3.	В программе - тестере создать два указателя на два класса, 
//выполнить преобразование указателя производного класса в базовый класс и выполнить преобразование указателя базового класса в производный класс.

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	setlocale(0, "");

	student a1("Царева", "Анастасия", "Максимовна", "Ашхабадский", 1, 5, 2004, 18), *aptr;
	schoolboy b1("хорошист", 53, 11), *bptr;
	aptr = &a1;
	bptr = &b1;
	cout << "вывод указателя aptr:" << endl;
	cout << *aptr;
	cout << endl;
	cout << "вывод указателя bptr:" << endl;
	cout << *bptr;
	cout << endl;
	aptr = bptr; //восходящиее преобразование
	cout << endl;
	//bptr = (schoolboy*) aptr;
	aptr = bptr;
	cout << "Вывод преобразованного указателя aptr" << endl;
	cout << *aptr << endl;
	bptr = (schoolboy*)&a1; // нисходящее преобразование
	cout << "Вывод преобразованного указателя bptr: " << endl;
	cout << *bptr;


	return 0;
}


Почему в 93 строке (bptr = (schoolboy*)&a1;) пишет progress=<Ошибка при чтении символов строки> и как это исправить?
И следовательно потом программа не хочет работать(
  • Вопрос задан
  • 264 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему в 93 строке (bptr = (schoolboy*)&a1;) пишет progress=<Ошибка при чтении символов строки>

Я уверен, что пишет он это на самом деле вот здесь: cout << *bptr;, а происходит это потому что bptr указывает на объект, конечный тип которого -- class student. У такого объекта в его представлении в памяти нет никакого поля progress, поэтому код который пытается его вывести ведёт себя таким образом. Вообще это пример неопределённого поведения.

как это исправить?

Тут явно какая-то проблема в логике. Для начала надо понять, что ты вообще хочешь чтобы произошло.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы