Jiahonzheng's Blog

C++ 继承

字数统计: 871阅读时长: 3 min
2018/04/06 Share

C++ 中,有三种类访问修饰符: publicprotectedprivate ,有三种继承方式:公有继承、保护继承和私有继承。

类访问修饰符

类的友元函数不是类的成员函数

public

可直接访问:类成员函数、派生类成员函数、友元函数、类对象。

待定:派生类对象(若为公有继承,则可直接访问;否则,不可直接访问)。

protected

可直接访问:类成员函数、派生类成员函数、友元函数。

不可直接访问:类对象、派生类对象。

private

可直接访问:类成员函数、友元函数。

不可直接访问:类对象、派生类对象。

继承

三种不同的继承方式的基类特性派生类特性

继承方式 public protected private
公有继承 public protected 不可见
保护继承 protected protected 不可见
私有继承 private private 不可见

由于派生类对象能直接访问的只能是派生类的 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
using namespace std;

// 基类
class A {
private:
int private_data_A;

protected:
int protected_data_A;

public:
int public_data_A;
};

// 基类A的派生类B(公有继承)
class B : public A {
public:
void funct() {
int b;
b = A::private_data_A; // error:基类中私有成员在派生类中是不可见的
b = A::protected_data_A; // ok:基类的保护成员在派生类中为保护成员
b = A::public_data_A; // ok:基类的公共成员在派生类中为公共成员
}
};

// 基类A的派生类C(私有继承)
class C : private A {
public:
void funct() {
int c;
c = A::private_data_A; // error:基类中私有成员在派生类中是不可见的
c = A::protected_data_A; // ok:基类的保护成员在派生类中为私有成员
c = A::public_data_A; // ok:基类的公共成员在派生类中为私有成员
}
};

// 基类A的派生类D(保护继承)
class D : protected A {
public:
void funct() {
int d;
d = A::private_data_A; // error:基类中私有成员在派生类中是不可见的
d = A::protected_data_A; // ok:基类的保护成员在派生类中为保护成员
d = A::public_data_A; // ok:基类的公共成员在派生类中为保护成员
}
};

int main() {
int a;

// 公有继承
B objB;
a = objB.private_data_A; // error:基类中私有成员在派生类中是不可见的,对派生类对象不可见
a = objB.protected_data_A; // error:基类的保护成员在派生类中为保护成员,对派生类对象不可见
a = objB.public_data_A; // ok:基类的公共成员在派生类中为公共成员,对派生类对象可见

// 私有继承
C objC;
a = objC.private_data_A; // error:基类中私有成员在派生类中是不可见的,对派生类对象不可见
a = objC.protected_data_A; // error:基类的保护成员在派生类中为私有成员,对派生类对象不可见
a = objC.public_data_A; // error:基类的公共成员在派生类中为私有成员,对派生类对象不可见

// 保护继承
D objD;
a = objD.private_data_A; // error:基类中私有成员在派生类中是不可见的,对派生类对象不可见
a = objD.protected_data_A; // error:基类的保护成员在派生类中为保护成员,对派生类对象不可见
a = objD.public_data_A; // error:基类的公共成员在派生类中为保护成员,对派生类对象不可见

return 0;
}

原文作者:Jiahonzheng

原文链接:https://blog.jiahonzheng.cn/2018/04/06/C++ 继承/

发表日期:April 6th 2018

更新日期:November 26th 2019

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 类访问修饰符
    1. 1.1. public
    2. 1.2. protected
    3. 1.3. private
  2. 2. 继承
  3. 3. 代码示例