基类类型和派生类型之间的转换以及虚函数

 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.派生类型的对象赋值到基类类型,派生对象部分的函数和数据成员会被截断。

Coding Life
原文地址:https://www.cnblogs.com/lewiskyo/p/4603736.html