【发布时间】:2021-10-18 09:45:03
【问题描述】:
我制作了一个我在代码中遇到的问题的玩具示例:
我有一只动物,我不知道后期会是什么,所以我将它初始化为普通动物。
但后来,我想让它变成一只猫,所以我将 myAnimal 指定为 Cat
#include <iostream>
class Animal {
public:
int weight;
virtual void Sound() {
// To be implemented by child class
}
};
class Cat : public Animal {
public:
void Sound() {
std::cout << "Miau" << std::endl;
}
// Only cats purr
void Purr() {
std::cout << "Purr" << std::endl;
}
};
int main() {
// At this point I don't know which animal I'll have, so I initialize it
// to a generic Animal
Animal* myAnimal;
animal->weight = 10;
// At this point of the code, I know what animal I want, so I assign animal
// to be a Cat
double selectedAnimal = 0;
if (selectedAnimal == 0) {
myAnimal = &Cat();
// myAnimal = new Cat(); // this will just create a new Cat, losing
// the already assigned weight.
// I want to "upgrade" my generic animal, keeping its properties and adding
// new ones specific to cats
}
myAnimal->Sound();
myAnimal->Purr(); // ERROR: Class Animal has no member Purr
return 0;
}
我认为我没有正确地将myAnimal 分配为Cat,但它仍然是Animal。但是,当我执行 myAnimal = &Cat(); 时,编译器不会抱怨。
所以我不明白编译器是否允许我将 Animal 分配给 Cat myAnimal = &Cat(); 类,为什么当我尝试使用特定于类 Cat 的方法时它会抱怨。
我应该如何重新分配我的通用动物,使其成为具有所有方法的完整 Cat?
编辑:
回答一些cmets:
-Animal 不应该有 Purr 方法,只有猫 purr。
-我在编译时不知道我将拥有什么 Animal,这就是为什么我一开始就将它指定为泛型。
我可以将 myAnimal 重新分配为一只新的 Cat,但是任何已经设置为通用动物的变量都将丢失(例如:Animal 在知道它是一只猫之前可能已经设置了一个权重变量)
我会尝试@Some程序员老兄建议的向下转换
【问题讨论】:
-
myAnimal = &Cat();- 这应该做什么?那不应该是myAnimal = new Cat();吗?其次,Animal类没有Purr方法的错误是不言自明的。看课程Animal。你看到Purr方法了吗? -
Cat myCat; myAnimal = &myCat将是另一种选择 - 只要 cat 的范围足够长 -
myAnimal->Purr();动物不会发出咕噜声,只有猫会发出咕噜声。你有一个设计问题。 -
编译器不会抱怨
myAnimal = &Cat();,因为它不是格式错误的(因此不需要诊断),它只是未定义的行为 -
这不是 python,
Animal* myAnimal永远只有动物方法,无论你分配什么。 C++ 是静态类型语言。
标签: c++ class inheritance