C++ "类中的访问标号"和"派生访问标号"的关系简析

首先介绍一下概念,我所说的类中的访问标号,如下例:

class Base
{
public:

protected:

private:

};

其中的public、protected、private即为“类中的访问控制标号”。

派生标号呢?也举一例:

class Derived1: public Base
{

};

其中的public即为“派生访问标号”,当然也有相应的protected、private。

1、public派生不改变基类中的成员和方法在派生类中的“类中的访问控制标号”。

2、protected将原来基类中的public成员和方法在派生类中的“类中的访问控制标号”变为protected。

3、private则相应的全部变为private。

现在想讨论的是,在这两种访问控制标号的影响下,我们能访问些什么 ?不能访问些什么?先看测试程序(其中注释掉的代码为有错误,不能编译通过的部分)

#include "stdafx.h"
#include <iostream>

using namespace std;

class Base
{
public:
	int pubi;
	void pub()
	{
		cout << "Base public" << endl;
	}
protected:
	int proi;
	void pro()
	{
		cout << "Base protected" << endl;
	}
private:
	int prii;
	void pri()
	{
		cout << "Base private" << endl;
	}
};

class Derived1: public Base
{
public:
	//proi = 1;
//protected:
	//proi = 1;
//private:
	//proi = 1;
	//pubi = 1;
	//Base::pub();
	int get1()
	{
		pub();
		pro();
		//pri();
		proi = 1;
		return proi;
	}
	int get2()
	{
		pubi = 1;
		return pubi;
	}
	int get3()
	{
		//puii = 1;
		//return puii;
	}
	//pub();
};

class Derived2: protected Base
{
	int get()
	{
		proi = 1;
		pub();
		pro();
		return proi;
	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	Derived1 d1;
	d1.pub();
	//d1.pro();
	//d1.pri();
	Derived2 d2;
	//d2.pub();
	return 0;
}

Derived1(public派生)想说明的是:

1、即便是在public派生访问标号的情况下,我们也不能直接对继承而来的,Base类中的public或者protected成员直接(指不是函数中,下同)进行赋值或修改(private的当然更不可能)。但我们可以在派生类Derived1的构造函数的初始化列表中,用基类Base的构造函数进行初始化基类的成员。

2、如//pub();所示,我们也不能在基类中直接调用基类的方法,即使是public的方法,当然也即便是在public派生。同理(protected、private的方法也不能直接调用)。

3、不过就上如上面所示,我们在派生类的函数中就可以访问public和protected成员和方法。总之,派生标号不影响派生类对基类成员的访问。

4、由类生成的对象只能访问类的public成员。

Derived2(protected派生):

进一步证实了上面的观点。感兴趣的朋友也可以自己在补充完整,再验证一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值