VC++ 公有继承/私有继承/保护继承的关键点说明

本文通过一个具体的C++程序示例,详细解析了不同继承方式下成员变量的访问权限,包括公有、私有及保护继承的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面我们通过调试一段程序,做出三种继承模式的关键点说明。


例题:请考虑标记为A到J的语句在编译时可能出现的情况。如果能够成功编译,请记为“RIGHT”,否则记为“ERROR”。

#include<iostream>
using namespace std;

class Parent {
public:
	Parent(int var = 1) :m_nPub(var),m_nPtd(var),m_nPrt(var){}

public:
	int m_nPub;
protected:
	int m_nPtd;
private:
	int m_nPrt;

};
class Child1 :public Parent {
public:
	int GetPub() {
		return m_nPub;
	}
	int GetPtd() {
		return m_nPtd;
	}
	int GetPrt() {
		return m_nPrt;//A
	}
};
class Child2 :protected Parent {
public:
	int GetPub() {
		return m_nPub;
	}
	int GetPtd() {
		return m_nPtd;
	}
	int GetPrt() {
		return m_nPrt;//B
	}
};
class Child3 :private Parent {
public:
	int GetPub() {
		return m_nPub;
	}
	int GetPtd() {
		return m_nPtd;
	}
	int GetPrt() {
		return m_nPrt;//C
	}
};
int main() {
	Child1 cd1;
	Child2 cd2;
	Child3 cd3;

	int nVal = 0;
	//public inherited
	cd1.m_nPub = nVal;//D
	cd1.GetPtd = nVal;//E
	nVal = cd1.GetPtd();//F
	//protected inherited
	cd2.m_nPub = nVal;//G
	nVal = cd2.GetPtd();//H
	//private ingerited
	cd3.m_nPub = nVal;//I
	nVal = cd3.GetPtd();//J
	return 0;
}


解析如下:

1、A、B、C都是错误的。因为m_nPrt是父类Parent的私有变量,所以不能被子类访问。

2、D是正确的。cd1是公有继承,可以访问并改变父类的公有变量。

3、E是错误,m_nPtd是父类Parent的保护变量,可以被公有继承的cd1访问,但不可以修改。

4、F是正确的,可以通过成员函数访问父类的保护变量。

5、G是错误的,cd2是保护继承,不可以直接修改父类的公有变量。

6、H是正确的,可以通过成员函数访问父类的保护变量。

7、I是错误的。cd3是私有继承,不可以直接修改父类的公有变量。

8、J是正确的,可以通过成员函数访问父类的保护变量。


注意:

1、公有继承:派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的公有成员和保护成员。

2、私有继承:基类的成员只能由派生类访问,而无法再往下继承。

3、保护继承:基类的成员只能由派生类访问,而无法再往下继承。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值