您的位置:首页 > 编程语言 > C语言/C++

C++ 之 继承和派生(2)

2017-09-22 14:10 288 查看

继承的访问控制

(一)、单个类的访问控制

public: 修饰的成员变量和成员函数(方法)在类的内部 类的外部都能使用

protected: 修饰的成员变量和方法,在类的内部使用 ,在继承的子类中可用 ;其他类的外部不能被使用

private: 修饰的成员变量和方法 只能在类的内部使用,不能在类的外部使用。

代码:

#include <stdio.h>

//父类Parent
class Parent
{
public:
int base_public;
protected:
int base_protected;
private:
int base_private;
};

int main()
{
Parent p1;
p1.base_public = 10;

//外部无法访问
//p1.base_protected = 20;
//p1.base_private = 30;

return 0;
}


(二)、继承权限

不同的继承方式会影响基类成员在派生类中的访问权限。

派生类对基类成员的访问有两种:内部访问(既函数访问)和外部访问(即对象访问)。

1)public继承方式(公有继承)

基类中所有 public 成员在派生类中为 public 属性;(可以内部访问和外部访问)

基类中所有 protected 成员在派生类中为 protected 属性;(只可以内部访问)

基类中所有 private 成员在派生类中不能使用。(无论内部访问还是外部访问都不可以)

代码:

#include <stdio.h>

//父类Parent
class Parent
{
public:
int base_public;
protected:
int base_protected;
private:
int base_private;
};

//子类 Child1
//公有继承 public
class Child1 : public Parent
{
public:
void UseValue ()
{
base_public = 10;
base_protected = 20;
//内部无法访问
//base_private = 30;
}
};

int main()
{
Child1 C1;
C1.base_public = 10;

//外部无法访问
//C1.base_protected = 20;
//C1.base_private = 30;

return 0;
}


2) protected继承方式(保护继承)

基类中的所有 public 成员在派生类中为 protected 属性;(只可以内部访问)

基类中的所有 protected 成员在派生类中为 protected 属性;(只可以内部访问)

基类中的所有 private 成员在派生类中不能使用。(无论内部访问还是外部访问都不可以)

代码:

#include <stdio.h>

//父类Parent
class Parent
{
public:
int base_public;
protected:
int base_protected;
private:
int base_private;
};

//子类 Child2
//保护继承 protected
class Child2 : protected Parent
{
public:
void UseValue ()
{
base_public = 10;
base_protected = 20;
//内部无法访问
//base_private = 30;
}
};

int main()
{
Chi
9f2b
ld2 C2;

//外部无法访问
//C2.base_public = 10;
//C2.base_protected = 20;
//C2.base_private = 30;

return 0;
}


3) private继承方式(私有继承)

基类中的所有 public 成员在派生类中均为 private 属性;(只可以内部访问)

基类中的所有 protected 成员在派生类中均为 private 属性;(只可以内部访问)

基类中的所有 private 成员在派生类中不能使用。 (无论内部访问还是外部访问都不可以)

代码:

#include <stdio.h>

//父类Parent
class Parent
{
public:
int base_public;
protected:
int base_protected;
private:
int base_private;
};

//子类 Child3
//私有继承 private
class Child3 : private Parent
{
public:
void UseValue ()
{
base_public = 10;
base_protected = 20;
//内部无法访问
//base_private = 30;
}
};

int main()
{
Child3 C3;

//外部无法访问
//C3.base_public = 10;
//C3.base_protected = 20;
//C3.base_private = 30;

return 0;
}


保护继承与私有继承的差别主要体现在当前派生类进一步派生的子类中,而在当前派生类这一层次上,保护继承与私有继承没有差别。

比如: Child私有继承了Parent类,而Child作为新的基类又派生出了Grandson类,那么Grandson的类的函数成员和对象都不能够访问Child从Parent类继承来的任何成员。

如果Child保护继承了Parent类,那么当Child类再派生出Grandson类时,Parent类中的Public和Protected成员都会被Grandson类继承为保护形式或者私有形式,但具体要看Grandson对Child的继承方式。

通过上面的分析可以发现:

1) 基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为 protected 时,那么基类成员在派生类中的访问权限最高也为 protected,高于 protected 的会降级为 protected,但低于 protected 不会升级。再如,当继承方式为 public 时,那么基类成员在派生类中的访问权限将保持不变。

也就是说,继承方式中的 public、protected、private 是用来指明基类成员在派生类中的最高访问权限的。

2) 不管继承方式如何,基类中的 private 成员在派生类中始终不能使用(不能在派生类的成员函数中访问或调用)。

3) 如果希望基类的成员能够被派生类继承并且毫无障碍地使用,那么这些成员只能声明为 public 或 protected;只有那些不希望在派生类中使用的成员才声明为 private。

4) 如果希望基类的成员既不向外暴露(不能通过对象访问),还能在派生类中使用,那么只能声明为 protected。

注意,我们这里说的是基类的 private 成员不能在派生类中使用,并没有说基类的 private 成员不能被继承。实际上,基类的 private 成员是能够被继承的,并且(成员变量)会占用派生类对象的内存,它只是在派生类中不可见,导致无法使用罢了。private 成员的这种特性,能够很好的对派生类隐藏基类的实现,以体现面向对象的封装性。

下表汇总了不同继承方式对不同属性的成员的影响结果



(三)、判断能否被访问方法

1)看调用语句位置,这句话写在子类的内部、外部

2)看子类如何从父类继承(public、private、protected)

3)看父类中的访问级别(public、private、protected)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: