(C/C++学习心得)5.C++中的虚继承-虚函数-多态解析

说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同。

 

一.虚继承

1.在多继承中,对于多个父类的数据及函数成员,虽然有时候把他们全部继承下来是有必要的,比如当这些成员都不同的时候。但在大多数的情况下,比如当多个父类之中的成员有重叠的地方时,因为保留多份数据成员的拷贝,不仅占有了较多的存储空间,还增加了访问的难度(由于继承了来自多个父类的同名数据成员,访问时需要加上父类的作用域,比如“父类名::成员”)。

2.在虚继承中,被虚继承的类叫做虚基类,虚基类是需要设计和抽象的,它应当提取多继承父类中重叠的部分作为成员,虚继承是对继承的一种扩展。

示例1:

(C/C++学习心得)5.C++中的虚继承-虚函数-多态解析

(C/C++学习心得)5.C++中的虚继承-虚函数-多态解析

1 #include<iostream> 2 using namespace std; 3 4 class furniture 5 { 6 public: 7 furniture(float l,float wi,float we) 8 :len(l),wid(wi),weight(we) 9 {} 10 void dis() 11 { 12 cout<<"len = "<<len<<endl; 13 cout<<"wid = "<<wid<<endl; 14 cout<<"weight="<<weight<<endl; 15 } 16 protected: 17 float len; 18 float wid; 19 float weight; 20 }; 21 22 //+++++++++++++++++++++++++ 23 24 class bed:virtual public furniture 25 { 26 public: 27 bed(float l,float wi,float we) 28 :furniture(l,wi,we) 29 {} 30 31 void sleep(){cout<<"go to sleep!!!!!"<<endl;} 32 }; 33 34 //+++++++++++++++++++++++++ 35 36 class sofa:virtual public furniture 37 { 38 public: 39 sofa(float l,float wi,float we) 40 :furniture(l,wi,we) 41 {} 42 43 void sit(){cout<<"go to have a rest!!!!!"<<endl;} 44 }; 45 46 //+++++++++++++++++++++++++ 47 48 class sofabed:public bed,public sofa 49 { 50 public: 51 sofabed(float l,float wi,float we) 52 :furniture(l,wi,we),bed(1,2,3),sofa(1,2,3) 53 {} 54 }; 55 56 int main() 57 { 58 bed b(1,2,3); 59 b.sleep(); 60 b.dis(); 61 sofa s(2,3,4); 62 s.sit(); 63 s.dis(); 64 sofabed sb(4,5,6); 65 sb.sleep(); 66 sb.sit(); 67 sb.dis(); 68 return 0; 69 } 70

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzgyx.html