继承

 

/*
继承的好处:减少重复代码
语法:class 子类 : 继承方式 父类
class A:public B;
A类称为子类或派生类
子类 也称为 派生类
父类 也称为 基类

派生类中的成员,包含两大部分:
一类是从基类继承过来的,一类是自己增加的成员。
从基类继承过来的表现其共性,而新增的成员体现了其个性
*/
/*继承方式
public、protected、private
继承得到的级别要小于等于继承方式
*/

 

 继承,怎么写继承,继承调用顺序,继承方式的理解

 1 #include <iostream>
 2 using namespace std;
 3 /*
 4 继承的好处:减少重复代码
 5 语法:class 子类 : 继承方式 父类
 6 class A:public B;
 7 A类称为子类或派生类 
 8 子类 也称为 派生类 
 9 父类 也称为 基类 
10 
11 派生类中的成员,包含两大部分:
12 一类是从基类继承过来的,一类是自己增加的成员。
13 从基类继承过来的表现其共性,而新增的成员体现了其个性  
14 */
15 /*继承方式
16 public、protected、private
17 继承得到的级别要小于等于继承方式 
18 */
19 
20 /*顺序问题,先父类再子类
21 父构造,子构造,子析构,父析构 
22 */
23 
24 /*继承同名成员处理
25 访问子类同名成员 直接访问即可
26 访问父类同名成员 需要加作用域
27 如果子类中出现和父类同名的成员函数,
28 子类的同名成员会隐藏掉 父类中所有同名成员函数 
29  如果想访问到父类中被隐藏的同名成员函数,需要加作用域 
30 ---静态成员也是一样 
31 */
32 
33 /*多继承语法
34 语法:class 子类 : 继承方式 父类 : 继承方式 父类2... 
35 !!!C++实际开发中不建议使用多继承 
36 */
37 class A{
38 public:
39     A(){
40         cout<<"这是A,也是父类"<<endl;
41     }
42     ~A(){
43         cout<<"这是父类A的析构函数"<<endl; 
44     }
45     void show(){
46         cout<<"这是父类A的show函数"<<endl;
47     }    
48 };
49 class B:public A{
50     public:
51         B(){
52             cout<<"这是B,应作为子类"<<endl;
53         }
54         ~B(){
55             cout<<"这是子类B的析构函数"<<endl; 
56         }
57         void show(){
58             cout<<"这是子类B的show函数"<<endl;
59         }
60         
61 };
62 class C:public A,public B{
63     public:
64         C(){
65             cout<<"这是C,是个子类"<<endl;
66         }
67         ~C(){
68             cout<<"这是子类C的析构函数"<<endl;
69         }
70         void show(){
71             cout<<"这是子类C的show函数"<<endl;
72         }
73 };
74 void test01(){
75 //    A a;
76 //    B b;
77 //    
78 //    b.A::show();
79 //    //如果通过子类对象 访问到父类中同名成员要加作用域 
80 //    b.show();
81     C c;
82     cout<<"sizeof(c)="<<sizeof(c)<<endl; 
83 }
84 
85 int main()
86 {
87     test01();
88     return 0;
89 }
继承

菱形继承问题与虚继承的解决方法

为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 //动物类
 5 class Animal{
 6     public:
 7         int m_Age;
 8 }; 
 9 //利用虚继承解决菱形继承的问题
10 //继承之前加上关键子virtual变为虚继承
11 //Animal类称为 虚基类 
12 /*为了解决多继承时的命名冲突和冗余数据问题,
13 C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。*/
14 //羊类
15 class Sheep:virtual public Animal{
16     
17 }; 
18 //驼类
19 class Camel:virtual public Animal{
20     
21 }; 
22 //羊驼类
23 
24 class Alpaca:public Sheep,public Camel{
25     
26 }; 
27 
28 
29 void test01(){
30     Alpaca alpaca;
31     alpaca.Sheep::m_Age=10;
32     alpaca.Camel::m_Age=18; 
33     cout<<"alpaca.Sheep::m_Age="<<alpaca.Sheep::m_Age<<endl;
34     cout<<"alpaca.Camel::m_Age="<<alpaca.Camel::m_Age<<endl;
35     cout<<"alpace.mAge="<<alpaca.m_Age<<endl;
36 }
37 
38 int main()
39 {
40     test01();
41     return 0;
42 }
菱形继承

 

posted @ 2023-09-07 10:41  HuangWQ289  阅读(15)  评论(0)    收藏  举报