Предыдущий пост -
Следующий пост -

Механизм виртуальных базовых классов.

Рубрика: C++, Дата: 23 April, 2013, Автор:

Изобразите возможное распределение памяти для класса Radio из параграфа 15.2.4. Объясните как можно реализовать вызов виртуальной функции.

От пример класса который нам дан в этом параграфе:

//racpredelenie pam9ti dl9 Radio
#include <iostream>
using std::cout;
using std::endl;

//camui verxnii bazovui klacc
class Storable
{
public:
	virtual const char* get_file()=0;
	Storable(){};
	Storable(const char* s){};
	virtual void read()=0;
	virtual void write()=0;
	virtual ~Storable(){cout <<"destr-Storable"<<endl;}
private:
	const char* store;
	
	Storable(const Storable&);
	Storable& operator=(const Storable&);
};

class Transmitter : public virtual Storable
{
public:
	void write(){cout <<"Transmitter::write()"<<endl;}
	//...
};

class Receiver : public virtual Storable
{
public:
	void write(){cout <<"Receiver::write()"<<endl;}
	//...
};

//camui nijnii bazovui klacc
class Radio : public Transmitter, virtual Receiver
{
public:
	const char* get_file(){cout <<"Radio::get_file()"<<endl;}
	void read(){cout <<"Radio::read()"<<endl;}
	void write();
	//...
};

void Radio::write()
{
	Transmitter::write();
	Receiver::write();
	cout <<"Redio::write"<<endl;
	//dalee piwem informaciyu, cpecufichnyyu dl9 Radio
}

int main()
{
	
	return 0;
}

Какое здесь будет распределение памяти? При таком наследовании : public virtual Storable создается всего один объект класса Storable. Так что у нас в классе Radio будет всего один объект класса Storable и уже неоднозначности не будет в отличии от реплицируемого наследования : http://www.kselax.ru/2013/04/raspredelenie-pamyati-dlya-klassa-radio/  Значит мы и вызов виртуальной функции будем делать по другому, сразу через указатель на объект Storable*

//racpredelenie pam9ti dl9 Radio
#include <iostream>
using std::cout;
using std::endl;

//camui verxnii bazovui klacc
class Storable
{
public:
	virtual const char* get_file()=0;
	Storable(){};
	Storable(const char* s){};
	virtual void read()=0;
	virtual void write()=0;
	virtual ~Storable(){cout <<"destr-Storable"<<endl;}
private:
	const char* store;
	
	Storable(const Storable&);
	Storable& operator=(const Storable&);
};

class Transmitter : public virtual Storable
{
public:
	void write(){cout <<"Transmitter::write()"<<endl;}
	//...
};

class Receiver : public virtual Storable
{
public:
	void write(){cout <<"Receiver::write()"<<endl;}
	//...
};

//camui nijnii bazovui klacc
class Radio : public Transmitter, virtual Receiver
{
public:
	const char* get_file(){cout <<"Radio::get_file()"<<endl;}
	void read(){cout <<"Radio::read()"<<endl;}
	void write();
	//...
};

void Radio::write()
{
	Transmitter::write();
	Receiver::write();
	cout <<"Redio::write"<<endl;
	//dalee piwem informaciyu, cpecufichnyyu dl9 Radio
}

int main()
{
	Radio R;
	Storable* S=&R;//owibka nel6z9 tak kak neodnoznachnoct6 dva ob6ekta
	S->write();//Radio::write()
	cout <<endl;
	S->read();//Radio::read();
	
	return 0;
}

От и все.

[youtube]http://www.youtube.com/watch?v=PVxbX7GJ3pg[/youtube]

rss