【发布时间】:2011-07-30 04:54:51
【问题描述】:
我是一个 c++ n00b,我不确定我是否找对了地方,但我对此感到困惑:
include <iostream>
using namespace std;
class Enemy
{
public:
void sayHere()
{
cout<<"Here"<<endl;
}
virtual void attack()
{
}
};
class Monster: public Enemy
{
public:
virtual void attack()
{
cout<<"RAWR"<<endl;
}
};
class Ninja: public Enemy
{
public:
virtual void attack()
{
cout<<"Hiya!"<<endl;
}
};
int main()
{
Ninja n;
Monster m;
Enemy enemies[2];
enemies[0] = m;
enemies[1] = n;
for(int i = 0; i<2; i++)
{
enemies[i].sayHere();
enemies[i].attack();//Will not be overriden
}
return 0;
}
我的问题是为什么 Monster 或 Ninja 类中的 attack() 函数没有被覆盖?任何帮助,甚至是链接,都将不胜感激。
【问题讨论】:
-
public Enemy?我一定是产生了幻觉…… -
记录一下,这种错误叫做“切片”:en.wikipedia.org/wiki/Object_slicing。基本上,当你写敌人[0]=m;你试图将一个太大的对象(m,它是派生的)卡到一个太小的内存位置(enemies[0],它是基础)。 C++ 对对象进行切片(“剪切”)并仅将其第一部分放在那里,即...基类。基本上,您只是将基类复制到数组中,并且数组中的所有对象都是 Enemy 类型。
-
过失,已经被告知。