C++中的继承模式深入详解

时间:2021-10-12 00:14:50

前言

继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。

一、继承规则

继承是C++中的重要特性,派生类可以访问基类中的protected和public成员
先上代码:

?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<iostream>
using namespace std;
 
class Base
{
    private:
            void func_pri();
    protected:
            void func_pro();
    public:
            void func_pub();
};
 
void Base::func_pri()
{
    cout << "private" << endl;
}
void Base::func_pro()
{
    cout << "protected" << endl;
}
void Base::func_pub()
{
    cout << "public" << endl;
    this->func_pri();
}
 
class Derive:public Base
{
    public:
        void function();
};
 
void Derive::function()
{
    //func_pri();调用private成员会产生编译错误
    func_pro();
    func_pub();
}
 
int main()
{
    Derive* derive;
    derive=new Derive;
    derive->function();
    //output:
    //protected public private
    delete derive;
    return 0;
}

酱在这里用一段简单地代码为大家说明了继承的规则。派生类只能访问基类的public和protected成员,无法访问private成员;若要调用类中private成员,要在类内部使用this指针传参(关于this指针的用法,酱在后续文章中会为大家进一步整理)。这里Derive是public Base,是公有继承。
上表:


C++中的继承模式深入详解

二、继承类型

首先要确立一个概念:无论是公有、私有还是保护继承,说到底它们都属于继承,满足继承的基本规则(如上表)。无论是private、protected还是public,对于直接向基类继承的派生类来说几乎没有影响(即俗称的“子代”而非“孙子代”)。上面的代码class Derive:public Base换成private Base和protected Base,结果都是一样的。
影响的是派生类的继承,即“孙子代”。

1.保护继承

先上代码:

?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<iostream>
using namespace std;
 
class Base
{
    private:
            void func_pri();
    protected:
            void func_pro();
    public:
            void func_pub();
};
 
void Base::func_pri()
{
    cout << "private" << endl;
}
void Base::func_pro()
{
    cout << "protected" << endl;
}
void Base::func_pub()
{
    cout << "public" << endl;
    this->func_pri();
}
 
class Derive:protected Base
{
    public:
        void function();
};
 
void Derive::function()
{
    func_pro();
    func_pub();
}
 
class Derive_sec:public Derive
{
    public:
        void func_sec();
};
 
void Derive_sec::func_sec()
{
    func_pub();
    func_pro();
    //func_pri();调用这里时会产生错误
}
 
int main()
{
    Derive_sec* derive;
    derive=new Derive_sec;
    derive->func_sec();
    delete derive;
    return 0;
}

这段代码运行后的结果是public protected。
可以看出的是Derive_sec类(子二代)可以调用的是Base基类的protected和public成员函数,而无法调用private成员函数。

2.私有继承

先上代码:

?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<iostream>
using namespace std;
 
class Base
{
    private:
            void func_pri();
    protected:
            void func_pro();
    public:
            void func_pub();
};
 
void Base::func_pri()
{
    cout << "private" << endl;
}
void Base::func_pro()
{
    cout << "protected" << endl;
}
void Base::func_pub()
{
    cout << "public" << endl;
    this->func_pri();
}
 
class Derive:private Base
{
    public:
        void function();
};
 
void Derive::function()
{
    func_pro();
    func_pub();
}
 
class Derive_sec:public Derive
{
    public:
        void func_sec();
};
 
void Derive_sec::func_sec()
{
    //func_pub();调用时会产生错误
    //func_pro();调用时会产生错误
    //func_pri();调用这里时会产生错误
    function();
}
 
int main()
{
    Derive_sec* derive;
    derive=new Derive_sec;
    derive->func_sec();
    delete derive;
    return 0;
}

通过结果来看,Derive_sec类(子二代)对Base基类中private、protected和public的成员函数均不能调用,但其仍然可以调用子一代的公有函数。

总结

在三种模式的继承中,我们可以看出当子一代设置为公有继承/保护继承基类时,子二代对基类protected、public成员变量可以访问,而对private变量不可访问;当子一代设置为私有继承基类时,子二代对基类private、protected、public成员变量均不能访问.
我们可以得出这样的结论:当基类和派生类具有直接继承关系时,按照上文所述继承规则即可;若派生类是经过对基类的多重继承得来的,则要考虑之前的继承模式。
private继承模式在对类之间的封装性有要求时,可以考虑使用。

到此这篇关于C++中的继承模式深入详解的文章就介绍到这了,更多相关C++中的继承模式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Snowydau/article/details/115036587