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成员),其他继承方式在通过派生类的对象访问时不可以访问基类中任何数据成员。

猜你喜欢

转载自www.cnblogs.com/-believe-me/p/11650454.html