Распределение памяти для класса Radio (база реплицируемый).

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

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

Вот код который был в параграфе:

//racpredelenie pam9ti dl9 Radio
#include <iostream>
using std::cout;
using std::endl;
 
class Storable
{
public:
    virtual const char* get_file()=0;
    virtual void read()=0;
    virtual void write()=0;
    virtual ~Storable(){}
};
 
class Transmitter : public Storable
{
public:
    void write();
    //...
};
 
class Receiver : public Storable
{
public:
    void write();
    //...
};
 
class Radio : public Transmitter, public Receiver
{
public:
    const char* get_file();
    void read();
    void write();
    //...
};
 
void Radio::write()
{
    Transmitter::write();
    Receive::write();
    //dalee piwem informaciyu, cpecufichnyyu dl9 Radio
}
 
int main()
{
    
    
    return 0;
}

Как мы видим у нас дано 4 класса построены ромбом.

Изобразите возможное распределение памяти для класса Radio. Я не знаю, что на это ответить. Какое же здесь будет распределение памяти? Я так думаю, что в Radio будет два объекта класса Storable хранится, а это значит, что если мы присвоим указателю на Storable адрес объекта Radio, то у нас будет неоднозначность, компилятор не будет знать, кокой объект Storable ему использовать, потому что их два Storable::Transmitter и Storable::Receiver. Так что так. Как же нам быть? А все просто вызвать виртуальную функцию для какого то отдельного объекта или для Transmitter или для Receiver. А еще хочу сказать, что эти классы Transmitter и Receiver виртуальные, потому что мы в них не переопределили чисто виртуальные функции из класса Storable, и они просто перенеслись в классы Transmitter и Receiver так как они есть чисто виртуальными, поэтому объекты этих классов создавать нельзя.

Я щас вам просто решение напишу сам код:

//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;
	virtual void read()=0;
	virtual void write()=0;
	virtual ~Storable(){}
};

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

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

//camui nijnii bazovui klacc
class Radio : public Transmitter, public 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();
	//dalee piwem informaciyu, cpecufichnyyu dl9 Radio
}

int main()
{
	Radio R;
	Storable* S;//owibka nel6z9 tak kak neodnoznachnoct6 dva ob6ekta
	
	//mojno cherez bazy Transmitter.
	Transmitter* T=&R;
	S=T;//кастим к Storable
	S->write();
	S->read();
	
	cout <<endl<<endl;
	//mojno cherez bazy Receiver
	Receiver* Re=&R;
	S=Re;//кастим к Storable.
	S->write();
	S->read();
	
	
	return 0;
}

От отакое решение этой задачки. А что по первой части, то там видимо лишний объект будет создан, то есть 4 базовых класса будет в Radio.

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

rss