下面我们通过调试一段程序,做出三种继承模式的关键点说明。
例题:请考虑标记为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、保护继承:基类的成员只能由派生类访问,而无法再往下继承。