Advertisement
RobertDeMilo

YB5.7 Виртуальные методы и передача объектов по ссылке

Apr 14th, 2024
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Animal
  6. {
  7. public:
  8.  
  9.     Animal(const string& type):type_(type){}
  10.  
  11.     void Eat(const string& fruit)
  12.     {
  13.         cout<<type_<<" eats "<<fruit<<endl;
  14.     }
  15.  
  16.     virtual void Voice()const
  17.     {
  18.         cout<< type_<<" is silent"<<endl;
  19.     }
  20.  
  21. private:
  22.     const string type_;
  23. };
  24.  
  25. class Cat : public Animal
  26. {
  27. public:
  28.  
  29.     Cat():Animal("cat"){}
  30.  
  31.  
  32.     void Voice() const override
  33.     {
  34.         cout << "Meow! " << endl;
  35.     }
  36. };
  37.  
  38. class Dog : public Animal
  39. {
  40. public:
  41.  
  42.     Dog():Animal("dog"){}
  43.  
  44.     void Voice() const override
  45.     {
  46.         cout << "Whaf! " << endl;
  47.     }
  48. };
  49.  
  50. class Parrot:public Animal
  51. {
  52. public:
  53.  
  54.     Parrot(const string& name):Animal("parrot"),name_(name){}
  55.  
  56.     void Voice() const override
  57.     {
  58.         cout<<name_<<" is good!"<<endl;
  59.     }
  60.  
  61. private:
  62.     const string& name_;
  63. };
  64.  
  65. class Horse: public Animal
  66. {
  67. public:
  68.     Horse():Animal("horse"){}
  69.  
  70. };
  71. Если передаем объекты не по ссылке, а по значению, то вызовется функция Voice из базового класса, а не из классов
  72. потомков как мы бы ожидали.
  73.    
  74. При передаче по значению теряется вся информация об объекте класса потомка и сохраняется информация только об объекте базового класса.
  75.  
  76. Если передавать объекты не по ссылке, а по значению, то мы потеряем преимущество виртуальных методов и не сможем ими
  77. воспользоваться
  78.  
  79. void MakeSound(const Animal a)
  80. {
  81.     a.Voice();
  82. }
  83.  
  84. int main()
  85. {
  86.     setlocale (LC_ALL,"ru");
  87.     Cat c;
  88.     Dog d;
  89.     Parrot p("Kesha");
  90.     Horse h;
  91.  
  92.     MakeSound(c);
  93.     MakeSound(d);
  94.     MakeSound(p);
  95.     MakeSound(h);
  96.  
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement