余睿的博客

浮生若梦,别多会少,不如莫遇

0%

c++覆盖和保护成员

基本概念

派生类可以定义一个和基类成员同名的成员,这就叫覆盖

在派生类中访问这类成员时,缺省的情况是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符号::

基类和派生类有同名成员的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Base {
private:
int j;
public:
int i;
void func() {};
};

class Derived :public Base {
public:
int i;
void access();
void func() {};
};

假设有如上的类,Derived类从Base类派生得到。其中两个类都定义了同名变量i以及同名函数func()

需要注意的是,在基类和派生类中应尽量避免同名的变量。

对于Derived类的access()函数,假设我们有如下实现:

1
2
3
4
5
6
7
void Derived::access() {
j = 0;//错误,j为基类的私有变量,不能访问
i = 5;//此处为派生类的i
Base::i = 5;//此处为基类的5
func();//派生类func()
Base::func();//基类func()
}
  • 在派生类中不能访问基类的私有变量。
  • 当基类与派生类有同名变量或函数时,直接访问该变量或函数时访问的为派生类的成员。
  • 要想访问基类中的同名函数或变量,需要使用::域运算符。

假设我们有如下定义:

1
Derived obj;

obj占用的存储空间如下:

派生类存储空间

类的保护成员

类成员的可访问范围

  • 基类的private成员:
    • 基类的成员函数
    • 基类的友元函数
  • 基类的public成员:
    • 基类的成员函数
    • 基类的友元函数
    • 派生类的成员函数
    • 派生类的友元函数
    • 其它的函数
  • 基类的protected成员:
    • 基类的成员函数
    • 基类的友元函数
    • 派生类的成员函数可以访问当前对象的基类保护成员

以下程序说明类的成员的可访问范围:

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
class Base {
private:
int nPrivate;
public:
int nPublic;
protected:
int nProtected;
};

class Derived :public Base {
void accessBase() {
nPrivate = 1;//错误,不能访问基类私有成员
nProtected = 1;//OK
nPublic = 1;//OK
Derived d;
d.nProtected = 1;//错误,d不是当前对象
}
};

int main() {
Derived d;
Base s;
d.nPublic = 1;//OK
s.nPublic = 1;//OK
d.nProtected = 1;//错误
s.nProtected = 1;//错误
d.nPrivate = 1;//错误
s.nPrivate = 1;//错误
}

欢迎关注我的其它发布渠道