一、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; }
- };
-
- class Child2 : protected Parent
- {
- public:
- int getPub() { return m_nPub; }
- int getPtd() { return m_nPtd; }
- int getPrt() { return m_nPrt; }
- };
-
- class Child3 : private Parent
- {
- public:
- int getPub() { return m_nPub; }
- int getPtd() { return m_nPtd; }
- int getPrt() { return m_nPrt; }
- };
-
- int main()
- {
- Child1 cd1;
- Child2 cd2;
- Child3 cd3;
-
- int nval = 0;
-
- cd1.m_nPub = nval;
- cd1.m_nPtd = nval;
- nval = cd1.getPtd();
-
- cd2.m_nPub = nval;
- nval = cd2.getPtd();
-
- cd3.m_nPub = nval;
- nval = cd3.getPtd();
-
- 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。