#include<iostream>
#include<string>
using namespace std;
class Pet
{
public:
virtual void print();
string name;
};
class Dog:public Pet
{
public:
virtual void print();
string breed; //breed 代表狗的种类;
};
int main()
{
Dog vdog;
Pet vpet;
vdog.name="tiny";
vdog.breed="great dane";
vpet=vdog;
//vpet.breed 是非法的因为pet没有breed 成员
Dog *pdog;
pdog=new Dog;
pdog->name="tiny";
pdog->breed="great dane";
Pet *ppet;
ppet=pdog;
pdog->print();
ppet->print();
//两个打印的是相同的输出
//以下语句直接访问成员变量,而不是通过虚函数,所以会出错
//cout<<"name:"<<ppet->name<<"breed:"<<ppet->breed<<endl;
return 0;
}
void Dog::print()
{
cout<<"name:"<<name<<endl;
cout<<"breed:"<<breed<<endl;
}
void Pet::print()
{
cout<<"name:"<<name<<endl;
}
虽然将一个派生类对象赋给一个基类对象是合法的,但是将一个派生类对象赋给基类时会产生切片问题,部分数据会被切掉。。在派生类中任何基类中没有的数据会在赋值中丢失,基类中未定义的任何成员函数都会丢失,倒是最终生成的基类对象无法使用它们。