c++源码分析继承问题

来源:互联网 发布:搜索引擎 数据库 区别 编辑:程序博客网 时间:2024/06/05 14:44
//c++的继承问题,有问题请留言
#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 错误,不管以何种继承方式,父类私有的成员对子类是隐藏的                                                                                 
};
//由上面的分析可以知道,不管以何种继承方式,父类的public和protected成员在子类中都是可以被访问的,私有成员都是隐藏的
int main()
{
Child1 cd1;
Child2 cd2;
Child3 cd3;
int nVar = 0;


//public inherited
cd1.m_nPub = nVar;//D 正确
cd1.m_nPtd = nVar;//E 错误,m_nPtd是父类的保护成员,可以被公有继承的子类访问,但是不能修改
nVar = cd1.GetPtd();//F 正确,可以通过函数访问父类的成员,并且赋值
//protected inherited
cd2.m_nPub = nVar;//G 错误 cd2是保护继承的,不可以直接修改父类的公有变量
nVar = cd2.GetPtd();//H 正确,可以通过函数访问父类的保护变量
//private inherited
cd3.m_nPub = nVar;//I 错误,cd3是私有继承的不可以直接修改父类的公有变量
nVar = cd3.GetPtd();//J 正确,可以通过函数访问父类的保护变量
//由上面的代码可以知道,父类的公有成员虽然都可以访问,但是只有公有继承的子类才可以直接修改
//父类的protected成员任何继承方式的子类都不可以修改,而且访问的方式只能是通过自己的成员函数,
//父类的private成员,任何方式都不能修改和访问
}
原创粉丝点击