多态的实现必须依靠指向同一类族的指针或引用,否则,就可能出现著名的对象切片(Object Slicing)问题。
class Bird{
public :
...//
virtual string Feature() const {...};
...//
};
class Parrot : public Bird{
...//
virtual string Feature() const {...};
...//
};
void DescribeBird(Bird bird){
cout << bird.Feature() << endl;//如果传入Parrot类的对象,则会出现对象切片现象
};
int main(){
Parrot bird("..", "..");
DescribeBird(bird);
}//Parrot类对象被切片后,经由拷贝构造在栈上将其生成为一个新的Bird对象
-------------------------------------------
C++内存模型规定,如果出现继承结构,内存分布一定是先基类部分的数据,后派生类部分的数据。派生类向基类映射后,会将其当成了一个基类对象。
===========================================
如果采用对象指针或引用,多态会正常发挥作用。
===========================================
在类中没有虚拟机制时,也有可能发生对象切片,只不过这种情况下,编译器会提示错误(转换成基类后的派生类对象,并没有派生类中的成员,故提示错误)。