Изобразите возможное распределение памяти для класса Radio из параграфа 15.2.3.1. Объясните как можно реализовать вызов виртуальной функции.
Вот код который был в параграфе:
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 |
//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 так как они есть чисто виртуальными, поэтому объекты этих классов создавать нельзя.
Я щас вам просто решение напишу сам код:
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 60 61 62 63 64 65 66 67 |
//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]