zoukankan      html  css  js  c++  java
  • C++类的继承方式探究

    一,继承方式简介

    1,三种继承方式:
    公有继承
    私有继承
    保护继承
    2,不同继承方式的影响主要体现在:
    (1)派生类成员对基类成员的访问权限
    (2)通过派生类对象对基类成员的访问权限

    二,公有继承

    1,公有继承(public)
    (1)继承的派生类访问控制
    基类的public和protected成员可以直接访问,但是基类的private成员,不可直接访问。

    class A {
    public:
    	int getA() { return a; }
    private:
    	int a;
    protected:
    	int c;
    };
    class B :public A {
    public:
    	void test1(){
    		getA();//基类的public成员在派生类中访问属性不变
    	}
    	void test2() {
    		a = 2;//基类的private成员在派生类中不可以访问,编译器报错
    	}
    	void test3() {
    		c = 2;//基类的protected成员在派生类可以访问
    	}
    };
    

    这里强调一下基类的private成员,在派生类中不可直接访问。编译器会报错:
    在这里插入图片描述

    (2)通过派生类的对象:只能访问public成员。

    #include<iostream>
    using namespace std;
    class A {
    public:
    	int testPublic() { cout << "Testing public member" << endl; }
    private:
    	int testPrivate() { cout << "Testing private member" << endl; }
    protected:
    	int testProtected() { cout << "Testing protected member" << endl; }
    };
    class B :public A {
    
    };
    int main()
    {
    	B b;
    	b.testPublic();
    	return 0;
    }
    

    通过派生类的对象,只能访问基类public成员。其他成员是不可见的,如下图
    在这里插入图片描述

    三,私有继承(private)

    (1)派生类中的成员函数访问权限:
    可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员;下面设计实验验证:

    在这里插入图片描述
    报错如下:
    在这里插入图片描述

    (2)派生类的对象访问权限:
    不能直接访问从基类继承的任何成员。这是因为基类的public和protected成员,被私有继承后,都以private身份出现在派生类中。
    实验验证:

    在这里插入图片描述

    四,保护继承(protected)

    (1)派生类中的成员函数访问权限:
    可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员,这点和public,private一样,但我们还需要实验验证一下:

    class A {
    public:
    	int testPublic() { cout << "Testing public member" << endl; }
    private:
    	int testPrivate() { cout << "Testing private member" << endl; }
    protected:
    	int testProtected() { cout << "Testing protected member" << endl; }
    };
    class B :protected A {
    public:
    	void test1() { testPublic(); }
    	void test2() { testProtected(); }
    	void test3() { testPrivate(); }//基类的private成员在派生类中不可以访问,编译器报错
    
    };
    
    

    基类的私有成员在派生类还是不能访问
    在这里插入图片描述

    (2)通过派生类的对象:
    不能直接访问从基类继承的任何成员。这是因为基类的public和protected成员继承后都以protected身份出现在派生类中。而protected成员在类外都是不能调用的。看一个例子:

    在这里插入图片描述
    (3)特点:
    对建立其所在类对象的模块来说,它与 private 成员的性质相同。如下图解释:
    在这里插入图片描述
    对于其派生类来说,它与 public 成员的性质相同。见下例:

    class A {
    
    protected:
    	int testProtected() { }
    };
    
    class B :public A {
    public:
    	void test() { testProtected(); }//对于其派生类来说,它与 public 成员的性质相同,即可以在类中被访问
    };
    

    既实现了数据隐藏,又方便继承,实现代码重用。

    五,三者对比总结:

    看了这三种继承方式访问属性是不是有点晕?将三者继承方式进行对比总结一下,便于记忆。
    1,三者共同点:不论以何种方式继承,派生类中成员函数都可以访问基类中public,protected成员,但是都不可以访问private成员。
    2,不同点:除了公有继承方式通过派生类的对象可以访问基类中的public成员外(且只能访问public成员),其他继承方式在通过派生类的对象访问时不可以访问基类中任何数据成员。

    --不忘初心,不负期许
  • 相关阅读:
    Python全栈day28(描述符应用)
    Python全栈day28(上下文管理)
    如何在B2C电子商务网站后台添加CNZZ统计代码(转)
    数据统计以及商城运营日志在电子商务中的重要性(转)
    电商企业运营规划——五年经验总结(转)
    电子商务数据运营入门——有哪些数据分析需要做 (转)
    IDC单IP绑定多域名(包括端口)
    商城自动备份
    CentOS安装crontab及使用方法(转)
    CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中(转)
  • 原文地址:https://www.cnblogs.com/-believe-me/p/11650454.html
Copyright © 2011-2022 走看看