【发布时间】:2018-02-06 19:32:58
【问题描述】:
我想问一下Java中的“instanceof”之类的东西。我创建了一个简单的继承示例。我的想法是创建一个抽象类 Monster 和孩子 Skeleton 和 Zombie,但是抽象它不起作用,所以我们有 std::vectorBase 类。我将子对象推入向量中。我想调用子类的方法,但是调用的方法是基类的空方法。有没有办法做到这一点?也许在 c++ 编程中我们应该避免这种代码思维,分别使用矢量骨架和矢量僵尸来做?对不起我的英语不好。我希望你能理解我的问题。
class Monster
{
public:
virtual void describe() {};
};
class Skeleton : public Monster
{
public:
Skeleton() {
}
~Skeleton(){}
void describe() override {
std::cout << "I am skeleton" << std::endl;
}
};
class Zombie : public Monster
{
public:
Zombie(){}
~Zombie(){}
void describe() override {
std::cout << "I am Zombie" << std::endl;
}
};
int main(void) {
std::vector<Monster> potwory;
potwory.push_back(Skeleton());
potwory.push_back(Zombie());
Skeleton sz;
Zombie z;
potwory.push_back(sz);
potwory.push_back(z);
for (auto i = 0; i < potwory.size(); i++) {
std::cout << typeid(potwory[i]).name() << std::endl; // each of them is Monster object
potwory[i].describe(); //here is calling method from base class , I want derived method.
}
std::cin.get();
return 0;
}`
【问题讨论】:
-
我对你的问题有点困惑。你能试着澄清一下你需要什么吗?
-
C++ 与 Java 的许多不同之处之一是它具有对象切片功能。 Java 避免了它,因为所有引用的行为方式都类似于 C++ 的指针。查看“对象切片”了解更多信息。
-
你只有一个基类对象的向量。每当你推送一个子类的对象时,你就有object slicing。要使多态性起作用,您需要引用或指针。
-
使用基类对象类型的
std:;vector会导致在 C++ 中称为对象切片的问题。在 SO 以及更广泛的网络中查找“对象切片”。 -
好的,谢谢你们。我会读到这个。