【发布时间】:2019-12-11 09:58:37
【问题描述】:
我对 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();
}
【问题讨论】:
-
现在编写一个接收任何 Pet 的函数并调用它的
MakeSound函数。假设您有 30 种不同的 Pet 类型,而不仅仅是 2 种。也许您缺少的部分是编写将采用指针或引用基类的函数。 -
Why do we need virtual functions in C++? 的可能重复 接受的答案非常深入,并附有一个关于 为什么
virtual函数有用的示例。 -
您在哪里尝试访问
n1、n2和n3?您的散文表明您的问题可能集中在这三个方面,但您的代码大多忽略了它们。 -
好的,谢谢@Fureeish。我只看到帖子。是的,我理解它,但我真的不知道如何在实际环境中使用它,如果我在小程序中使用它就可以了,但是其他......
-
考虑捕获
const std::exception&并输出其what()返回值。使用virtual函数,您无需知道异常的确切类型即可获得有意义的信息和结果。
标签: c++ inheritance polymorphism virtual