• 【 C++】11 C++的继承


    1、继承方式

    ​ 继承的语法:class 子类 : 继承方式 父类
    ​ 三种继承方式:
    ​ ​ - 公有继承
    ​ ​ - 保护继承
    ​ ​ - 私有继承

    在这里插入图片描述
    ​ 就算子类访问不了父类中的private,但是还是会继承并隐藏

    2、继承的对象的结构查看方式

    ​ 通过,vs2017开发人员命令提示符 通过 cddir到项目的目录,然后输入:cl /d1 reportSingleClassLayout,输入类名,然后靠 tab 来自动补齐文件名字。以此来查看对象的结构。比如:

    cl /d1 reportSingleClassLayoutAnimal "main.cpp"
    
    • 1

    3、继承中的同名成员处理

    • 访问子类同名成员 直接访问即可
    • 访问父类同名成员 需要加作用域
    • 当子类与父类拥有同名的成员函数,子类会隐藏父类中的同名成员函数,要使用需加作用域
    class Father{
    public:
    	Father(){
    		A = 100;
    	}
    	int A;
    }
    class Son{
    public:
    	Son(){
    	A = 200;
    	}
    	int A;
    }
    void Test01(){
    	Son son;
    	cout << son.A << endl;		  	//输出:200,默认的输出是子类的同名成员变量
    	cout << son.Father::A << endl;	//输出:100,加了作用域,输出父类的同名变量
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4、继承静态变量成员处理

    ​ 静态成员

    class Father{
    public:
    	static int A;
    };
    int Father::A = 100;		//类内声明,类外初始化
    class Son{
    public:
    	static int A;
    };
    int Son::A = 200;			//类内声明,类外初始化
    
    void test01(){
    	//通过对象访问
    	Son s;
    	cout << s.A << endl;
    	cout << s.Father::A << endl;
    	//静态变量又可以不创建对象,直接通过类名访问
    	cout << Son::A << endl;
    	cout << Son::Father::A << endl;
    	//通过子类域到父类域,访问到Father中的 重名静态变量
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    (静态函数同理)

    5、多继承

    ​ C++中允许一个类继承多个类,C++实际开发中不建议用多继承。
    ​ 语法:class 子类 : 继承方式 父类1, 继承方式 父类2...
    ​ 多继承可能出现多个重名,需要用作用域来区分。

    6、菱形继承

    ​ 利用 虚继承 来解决菱形继承的问题。

    在这里插入图片描述

    //间接基类A
    class A{
    protected:
        int m_a;
    };
    
    //直接基类B
    class B: virtual public A{  //虚继承
    protected:
        int m_b;
    };
    
    //直接基类C
    class C: virtual public A{  //虚继承
    protected:
        int m_c;
    };
    
    //派生类D
    class D: public B, public C{
    public:
        void seta(int a){ m_a = a; }  //正确
        void setb(int b){ m_b = b; }  //正确
        void setc(int c){ m_c = c; }  //正确
        void setd(int d){ m_d = d; }  //正确
    private:
        int m_d;
    };
    
    int main(){
        D d;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    7、子类构造函数

      假如父类的构造需要参数,那么子类构造的时候就需要用初始化列表来传递参数。

    class A{
    public:
    	A(int a):val(a){};
    	int val;
    };
    
    class B: public A{
    public:
    	B(int a,int b):A(a),val2(b){};
    	int val2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    生成模型(1)无监督生成模型
    13.Ansible.roles案例
    SAP FI/SD的集成-VKOA科目确定
    【校招VIP】前端计算机网络之HTTP和HTTPS
    三元组(C++ 实现矩阵快速转置)
    linux Shell入门
    autojs实现自动答题、复诵答案、100%正确率
    数据库-----JDBC技术
    企业电子招投标采购系统——功能模块&功能描述+数字化采购管理 采购招投标
    自定义表单开源好用吗?有哪些优势特点?
  • 原文地址:https://blog.csdn.net/qq_40891541/article/details/127860487