码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-27 11:25:45      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:


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

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

标签:

原文地址:http://www.cnblogs.com/lewiskyo/p/4603736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!