C++继承访问权限

本文详细阐述了C++中public、protected和private继承模式的区别,包括可访问性、多重继承场景下成员的可见性,以及不同继承方式对子类对象和内部访问的影响。理解这些将有助于开发者更灵活地运用继承进行设计。
摘要由CSDN通过智能技术生成

关于C++的继承模式

一、public 继承

(1)若一个类关于一个基类公用继承那么,建立这个类的对象时可以调用基类里面的公有成员。

而在此类内可以调用基类的公有以及保护的数据成员,但不能调用的私有。对于私有数据,这个类还是把他们都继承过来了的只是不可用而已。

若在son类中的public里加了一句:

father::Fa;//原为基类的保护成员,本不可调用

那么此时在建立son的对象时可以调用Fa。若加到protected 或 private 明显在对象中是不可调用的。

class father {
protected:
	int Fa;
private :
	int Fb;
public:
	int Fc;
	father(int a=0, int b=0, int c=0):Fa(a),Fb(b),Fc(c) {}
	~father() {
		cout << "father destructor!" << endl;
	}
};
class son : public father {
public:
	int Sa;
	son(int a=0,int b=0,int c=0):Sa(a),Sb(b),Sc(c) {}
	~son() {
		cout << "son destructor!!!" << endl;
	}
protected:
	int Sb;
private:
	int Sc;
};

(2)若有三层继承,如下代码

class father {
protected:
	int Fa;
private :
	int Fb;
public:
	int Fc;
	father(int a=0, int b=0, int c=0):Fa(a),Fb(b),Fc(c) {}
	~father() {
		cout << "father destructor!" << endl;
	}
};
class son : public father {
public:
	int Sa;
	son(int a=0,int b=0,int c=0):Sa(a),Sb(b),Sc(c) {}
	~son() {
		cout << "son destructor!!!" << endl;
	}
protected:
	int Sb;
private:
	int Sc;
};
class grand :public son {
public :
	grand(int a=0, int b=0,int c=0):Ca(a),Cb(b),Cc(c){}
	int Ca;
protected:
	int Cb;
private: 
	int Cc;
};

此时建立grand 的对象,仍然可以调用father的公用数据成员,且可调用son的公用数据成员。在grand的类内可以调用father类的公有以及保护成员,也可以调用son的公有以及保护成员。

二、protected 继承

(1)二重继承时

protected:
	int Fa;
private :
	int Fb;
public:
	int Fc;
	father(int a=0, int b=0, int c=0):Fa(a),Fb(b),Fc(c) {}
	~father() {
		cout << "father destructor!" << endl;
	}
};
class son : protected father {
public:
	int Sa;
	son(int a=0,int b=0,int c=0):Sa(a),Sb(b),Sc(c) {}
	~son() {
		cout << "son destructor!!!" << endl;
	}
protected:
	int Sb;
private:
	int Sc;
};

建立son的对象只能调用son的公有成员,不能调用father的数据了。

而在son内的话除了私有成员应该都还是可以调用的

(2)三重继承(第三重是公有,第二重是protect)

class father {
protected:
	int Fa;
private :
	int Fb;
public:
	int Fc;
	father(int a=0, int b=0, int c=0):Fa(a),Fb(b),Fc(c) {}
	~father() {
		cout << "father destructor!" << endl;
	}
};
class son : protected father {
public:
	int Sa;
	son(int a=0,int b=0,int c=0):Sa(a),Sb(b),Sc(c) {}
	~son() {
		cout << "son destructor!!!" << endl;
	}
protected:
	int Sb;
private:
	int Sc;
};
class grand :public son {
public :
	grand(int a=0, int b=0,int c=0):Ca(a),Cb(b),Cc(c){}
	int Ca;
protected:
	int Cb;
private: 
	int Cc;
};

此时grand内可以调用son的公有以及保护成员,也可调用father的公有以及保护。

对于grand的对象只能调用son的公有成员和自己的公有数据。

(3)三重继承(都是protect)

class father {
protected:
	int Fa;
private :
	int Fb;
public:
	int Fc;
	father(int a=0, int b=0, int c=0):Fa(a),Fb(b),Fc(c) {}
	~father() {
		cout << "father destructor!" << endl;
	}
};
class son : protected father {
public:
	int Sa;
	son(int a=0,int b=0,int c=0):Sa(a),Sb(b),Sc(c) {}
	~son() {
		cout << "son destructor!!!" << endl;
	}
protected:
	int Sb;
private:
	int Sc;
};
class grand :protected son {
public :
	grand(int a=0, int b=0,int c=0):Ca(a),Cb(b),Cc(c){
	}
	int Ca;
protected:
	int Cb;
private: 
	int Cc;
};

其实也差不多在grand内可以调用father,以及son 的公有以及保护内容。

而建立grand的对象的话,只能调用grand的公有成员了

三、private 继承

(1)二重继承

在son类内还是可以调用father的非private的成员。

其实private继承把father封闭了,除非用:

	father::Fa;
	father::Fc;

这两句在son的public内用就可在son的对象中用father的这两个数据,而在protect里面对象就不可用,而son自己可用。

(2)三重private继承

class father {
protected:
	int Fa;
private :
	int Fb;
public:
	int Fc;
	father(int a=0, int b=0, int c=0):Fa(a),Fb(b),Fc(c) {}
	~father() {
		cout << "father destructor!" << endl;
	}
};
class son : private father {
public:
	int Sa;
	son(int a=0,int b=0,int c=0):Sa(a),Sb(b),Sc(c) {
	}
	~son() {
		cout << "son destructor!!!" << endl;
	}
protected:
	int Sb;
private:
	int Sc;
};
class grand :private son {
public :
	grand(int a=0, int b=0,int c=0):Ca(a),Cb(b),Cc(c){
		
	}
	int Ca;
protected:
	int Cb;
private: 
	int Cc;
};

若没有意外,在grand内可以访问son的公有和保护,而不可访问father。

而有如下情节就不一样了:

class father {
protected:
	int Fa;
private :
	int Fb;
public:
	int Fc;
	father(int a=0, int b=0, int c=0):Fa(a),Fb(b),Fc(c) {}
	~father() {
		cout << "father destructor!" << endl;
	}
};
class son : private father {
public:
	int Sa;
	father::Fa;//!!!!!!!!!!!注意这里
	father::Fc;//!!!!!!!!!!!注意这里
	son(int a=0,int b=0,int c=0):Sa(a),Sb(b),Sc(c) {
	}
	~son() {
		cout << "son destructor!!!" << endl;
	}
protected:
	int Sb;
private:
	int Sc;
};
class grand :private son {
public :
	grand(int a=0, int b=0,int c=0):Ca(a),Cb(b),Cc(c){
	
	}
	int Ca;
protected:
	int Cb;
private: 
	int Cc;
};

代码中的注意部分出现那么即使在grand那是private继承,在grand类内还是可以访问Fa,Fc,同样可以访问son的非私有成员。

当然建立了对象就不可了。

四、总结

​ 反正不管怎么继承父类的私有数据咋都动不了,其他看情况即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xwhking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值