Объркан съм относно полиморфизма в C++. Изучавам го сам и разбрах основните му характеристики. Но не разбирам защо е полезно. Преди да изучавам полиморфизма (относно oop), изучавах наследяването (това е полезно, защото можете да използвате метод в суперкласа и подкласа, пишейки само веднъж). Сега съм заседнал с полиморфизма и ключовата дума virtual
. Не разбирам защо е полезно. Вижте кода по-долу (това е упражнение за института C++ (ще получа сертификат)). Защо мога да декларирам като "виртуални" само функции? Добавям в кода променливите n1
, n2
, n3
(като публични), защо нямам достъп до тях? Изобщо не разбирам полиморфизма, прочетох купища публикации за полиморфизъм в StackOverflow, но сякаш разбирам полиморфизма на 50%. Забелязах, че полиморфизмът е по-малко труден за разбиране в Python, тъй като Python няма типове данни, но искам да го разбера и в C++ и възможните му употреби.
#include <iostream>
using namespace std;
class Pet {
protected:
string Name;
public:
Pet(string n) { Name = n; }
virtual void MakeSound(void) { cout << Name << " the Pet says: Shh! Shh!" << endl; }
int n1;
};
class Cat : public Pet {
public:
Cat(string n) : Pet(n) { }
void MakeSound(void) { cout << Name << " the Cat says: Meow! Meow!" << endl; }
int n2;
};
class Dog : public Pet {
public:
Dog(string n) : Pet(n) { }
void MakeSound(void) { cout << Name << " the Dog says: Woof! Woof!" << endl; }
int n3;
};
int main(void) {
Pet* a_pet1, * a_pet2;
Cat* a_cat;
Dog* a_dog;
a_pet1 = a_cat = new Cat("Kitty");
a_pet2 = a_dog = new Dog("Doggie");
a_pet1->MakeSound();
a_cat->MakeSound();
static_cast<Pet*>(a_cat)->MakeSound();
a_pet2->MakeSound();
a_dog->MakeSound();
static_cast<Pet*>(a_dog)->MakeSound();
}
MakeSound
функция. Да приемем, че имате 30 различни типа Pet, а не само 2. Може би частта, която пропускате, е в писането на функции, които ще приемат указател или препратка към базов клас. - person PaulMcKenzie   schedule 02.08.2019virtual
функциите са полезни. - person Fureeish   schedule 02.08.2019n1
,n2
иn3
? Вашата проза предполага, че въпросът ви може да е фокусиран върху тези три, но кодът ви най-вече ги игнорира. - person JaMiT   schedule 02.08.2019const std::exception&
и извеждане на неговатаwhat()
върната стойност. С функциитеvirtual
не е нужно да знаете точния тип на изключението, за да получите значима информация и резултати. - person Fureeish   schedule 03.08.2019int main(void)
същото ли е катоint main()
? - person   schedule 03.08.2019