Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2011, 16:42   #1
Саааня
Новичок
Джуниор
 
Регистрация: 11.08.2011
Сообщений: 4
По умолчанию Простое наследование

вот создал 2 класса для хранения считанных из потока данных
Код:
class CRecord
{
private:

	RecordHeader header;
public:
	void SetHeader( WORD id, WORD sz)
	{
		header.identifier = id;
		header.size = sz;
	}

	WORD GetHeaderID()
	{
		return header.identifier;
	}

	WORD GetSize()
	{
		return header.size;
	}

	CRecord()
	{
		SetHeader(0,0);
	}

	CRecord( RecordHeader he)
	{
		SetHeader(he.identifier, he.size);
	}
};
class BOF_Rec: public CRecord
{

public:
	WORD vers;
	WORD dt;
	WORD rupBuild;
	WORD rupYear;
	DWORD bfh;
	DWORD sfo;
	BOF_Rec( ): CRecord()
	{ 
		vers=0;
		dt=0;
		rupBuild=0;
		rupYear=0;
		bfh=0;
		sfo=0;
	}
	BOF_Rec(RecordHeader he): CRecord(he)
	{
		vers=0;
		dt=0;
		rupBuild=0;
		rupYear=0;
		bfh=0;
		sfo=0;
	}

};
соответственно , BOF_Rec наследник CRecord
дальше хочу создать объект класса BOF_Rec,но почему-то создается объект класса CRecord
Код:
CRecord *record;
record = new BOF_Rec;
подскажите как быть...
Саааня вне форума Ответить с цитированием
Старый 11.08.2011, 17:44   #2
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

На самом деле создается объект типа BOF_Rec но поскольку он наследуется от CRecord он является и CRecord поэтому присвоение происходит без проблем. Но через этот указатель ты можешь обратится только к тем членам BOF_Rec которые он унаследовал от CRecord ;
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 11.08.2011, 17:46   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

1) создаётся таки объект класса BOF_Rec

2) почему бы тогда не:

Код:
BOF_Rec *record;
3) ну и в конце-концов

Код:
BOF_Rec* newClass = dynamic_cast<BOF_Rec*>(record);
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.08.2011, 17:51   #4
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Код:
BOF_Rec *record = new BOF_Rec;
или я не понимаю в чем проблема
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 11.08.2011, 23:03   #5
Саааня
Новичок
Джуниор
 
Регистрация: 11.08.2011
Сообщений: 4
По умолчанию

Нет нет,все так.
Вся проблема в том,что наследников класса планируется несколько десятков, и хотелось бы хранить указатели на все экземпляры,скажем в vector<CRecord*>, и при этом хотелось бы иметь возможность доступа ко всем полям наследников.
Воооооооот...надеюсь не слишком запутанно сказал
Саааня вне форума Ответить с цитированием
Старый 11.08.2011, 23:40   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Проблема в том, что вы не читаете то, что вам отвечают.
Конкретно, что вас в такой записи не устраивает?

Код:
	CRecord *record;
	record = new BOF_Rec;

	static_cast<BOF_Rec*>(record)->rupYear = 2012;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.08.2011, 00:28   #7
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Саааня Посмотреть сообщение
Вся проблема в том,что наследников класса планируется несколько десятков, и хотелось бы хранить указатели на все экземпляры,скажем в vector<CRecord*>, и при этом хотелось бы иметь возможность доступа ко всем полям наследников.
Тогда лучше поля сделать закрытыми, а методы объявить виртуальными.
An1ka вне форума Ответить с цитированием
Старый 12.08.2011, 00:45   #8
Саааня
Новичок
Джуниор
 
Регистрация: 11.08.2011
Сообщений: 4
По умолчанию

veniside, спасибо,все работает)
Саааня вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простое суммирование Trimbl Microsoft Office Excel 2 20.12.2010 08:58
Объясните простое уравнение Crudelis Общие вопросы C/C++ 3 25.11.2010 12:25
простое и составное число. Alt_Shift Общие вопросы C/C++ 6 14.11.2010 11:05
Простое любопытство.... KORT Свободное общение 130 20.06.2009 19:06