请考虑标记为A到J的语句在编译时可能出现的情况。如果能够成功编译,请记为RIGHT,否则标记为ERROR。
#include<iostream>
#include<stdio.h>
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 nVar=0;
cd1.m_nPub=nVar; //D
cd1.m_nPtd=nVar; //E
nVar=cd1.GetPtd(); //F
cd2.m_nPub=nVar; //G
nVar=cd2.GetPtd(); //H
cd3.m_nPub=nVar; //I
nVar=cd3.GetPtd(); //J
return 0;
}
解析:
A、B、C是错误的,因为m_nPtr是父类的私有变量,所以不能被子类访问(任何一种继承方式都不行)。
D正确。cd1是公有继承,可以访问并改变父类的公有变量。
E错误,m_nPtd是父类Parent的保护变量,可以被公有继承的cd1访问,但不可以修改。!!!
F正确,公有继承下,可以通过子类函数访问父类的保护变量。
G错误,cd2是保护继承的,不可以直接修改父类的公有变量!!!。
H正确,保护继承下,可以通过函数访问父类的保护变量。
I错误,cd3是私有继承的,不可以直接修改父类的公有变量!!!。
J正确,私有继承下,可以通过函数访问父类的保护变量!!!。