一、c++继承关系理解
请考虑下面标记为A~J的语句在编译时可能出现的情况,如果能够成功编译,请记为“RIGHT”,否则即为“ERROR”
#include <iostream>
using namespace std;
class Parent
{
private:
int m_nPrt;
protected:
int m_nPtd;
public:
int m_nPub;
public:
Parent(int val = -1)
{
m_nPub = val;
m_nPtd = val;
m_nPrt = val;
}
};
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;
cd1.m_nPub = nval; //D
cd1.m_nPtd = nval; //E
nval = cd1.getPtd(); //F
cd2.m_nPub = nval; //G
nval = cd2.getPtd(); //H
cd3.m_nPub = nval; //I
nval = cd3.getPtd(); //J
return 0;
}
A、B、C错误。m_nPrt是基类Parent的私有变量,不能被派生类访问。
D正确,Child1是public继承,可以访问基类的public成员
E错误,m_nPtd是基类的protected成员变量,通过public继承变成派生类的protected成员,因此只能在派生类内部访问,不能被对象访问。
F正确,可以通过成员函数访问protected变量。
G错误,这是protected继承,原有的public和protected的成员变量都变为protected变量,因此只能被类访问,不能被对象访问。
H正确,可以通过成员函数访问protected变量。
I错误,这是private继承,原有的变量都变为private,对象无法访问
J正确,可以通过成员函数访问private变量
二、看代码找错误——c++继承
#include <iostream>
using namespace std;
class base
{
int i;
public:
base(int x) { i = x; }
};
class derived : public base
{
int i;
public:
derived(int x, int y) { i = x; }
void printTotal()
{
int total = i + base::i;
cout<<"total = "<<total<<endl;
}
};
int main()
{
derived d(1, 2);
d.printTotal();
return 0;
}
这个程序有如下两个错误:
(1)在derived类进行构造时,它首先要调用其基类的构造方法,由于没有指明何种构造方法,因此默认调用base类不带参数的构造方法。然而,基类base中已经定义了带一个参数的构造函数,所以编译器就不会给它定义默认的构造函数了。因此代码第16行会出现找不到构造方法的编译错误。解决办法,在derived的构造函数添加基类的构造函数。
(2)在derived类的printTotal()中,使用base::i的方式调用base类的私有成员i,这个会得到“不能访问私有成员”的编译错误,解决办法,将i设为public。