1 #include <string> 2 #include <iostream> 3 using namespace std; 4 5 class Animal{ 6 public: 7 Animal(string name) : name(name){} 8 void printName(){ 9 cout<<name<<endl; 10 } 11 virtual void printSpecialSkill(){}; 12 private: 13 string name; 14 }; 15 16 class Bird : public Animal { 17 public: 18 Bird(string name,string specialSkill) : Animal(name),specialSkill(specialSkill){} 19 void printSpecialSkill(){ 20 cout<<specialSkill<<endl; 21 } 22 23 private: 24 string specialSkill; 25 }; 26 27 class Fish : public Animal { 28 public: 29 Fish(string name,string specialSkill) : Animal(name),specialSkill(specialSkill){} 30 void printSpecialSkill(){ 31 cout<<specialSkill<<endl; 32 } 33 34 private: 35 string specialSkill; 36 }; 37 38 39 40 int main() 41 { 42 Bird *PBird = new Bird("Powl","fly"); 43 Bird ObjBird("ObjBird","fly"); 44 45 Fish ObjFish("ObjShark","swim"); 46 47 Animal ObjAnimal(ObjBird); 48 ObjAnimal.printName(); 49 /*派生类型的对象赋值到基类类型,派生对象部分的函数和数据成员会被截断。 50 所以这里无输出*/ 51 ObjAnimal.printSpecialSkill(); 52 53 /*派生类型的对象,可以用它的地址对基类类型的指针进行赋值或者初始化。 54 基类指针指向派生类对象,实现多态和虚函数*/ 55 Animal* PAnimal = &ObjBird; 56 PAnimal->printName(); 57 /*派生类对象赋值给基类指针,则不会发生截断*/ 58 PAnimal->printSpecialSkill(); 59 60 PAnimal = &ObjFish; 61 PAnimal->printName(); 62 PAnimal->printSpecialSkill(); 63 }
1.没有从基类引用(或基类指针)到派生类引用(或派生类指针)的自动转换。
2.派生类型的对象,可以用它的地址对基类类型的指针进行赋值或者初始化。
3.派生类型的对象赋值到基类类型,派生对象部分的函数和数据成员会被截断。