Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- class Animal
- {
- public:
- Animal(const string& type):type_(type){}
- void Eat(const string& fruit)
- {
- cout<<type_<<" eats "<<fruit<<endl;
- }
- virtual void Voice()const
- {
- cout<< type_<<" is silent"<<endl;
- }
- private:
- const string type_;
- };
- class Cat : public Animal
- {
- public:
- Cat():Animal("cat"){}
- void Voice() const override
- {
- cout << "Meow! " << endl;
- }
- };
- class Dog : public Animal
- {
- public:
- Dog():Animal("dog"){}
- void Voice() const override
- {
- cout << "Whaf! " << endl;
- }
- };
- class Parrot:public Animal
- {
- public:
- Parrot(const string& name):Animal("parrot"),name_(name){}
- void Voice() const override
- {
- cout<<name_<<" is good!"<<endl;
- }
- private:
- const string& name_;
- };
- class Horse: public Animal
- {
- public:
- Horse():Animal("horse"){}
- };
- Если передаем объекты не по ссылке, а по значению, то вызовется функция Voice из базового класса, а не из классов
- потомков как мы бы ожидали.
- При передаче по значению теряется вся информация об объекте класса потомка и сохраняется информация только об объекте базового класса.
- Если передавать объекты не по ссылке, а по значению, то мы потеряем преимущество виртуальных методов и не сможем ими
- воспользоваться
- void MakeSound(const Animal a)
- {
- a.Voice();
- }
- int main()
- {
- setlocale (LC_ALL,"ru");
- Cat c;
- Dog d;
- Parrot p("Kesha");
- Horse h;
- MakeSound(c);
- MakeSound(d);
- MakeSound(p);
- MakeSound(h);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement