C/C++ -- C++继承

一、c++继承关系理解

请考虑下面标记为A~J的语句在编译时可能出现的情况,如果能够成功编译,请记为“RIGHT”,否则即为“ERROR”

[cpp]  view plain  copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. class Parent  
  6. {  
  7. private:  
  8.     int m_nPrt;  
  9. protected:  
  10.     int m_nPtd;  
  11. public:  
  12.     int m_nPub;  
  13. public:  
  14.     Parent(int val = -1)  
  15.     {  
  16.         m_nPub = val;  
  17.         m_nPtd = val;  
  18.         m_nPrt = val;  
  19.     }  
  20. };  
  21.   
  22. class Child1 : public Parent  
  23. {  
  24. public:  
  25.     int getPub() { return m_nPub; }  
  26.     int getPtd() { return m_nPtd; }  
  27.     int getPrt() { return m_nPrt; }         //A  
  28. };  
  29.   
  30. class Child2 : protected Parent  
  31. {  
  32. public:  
  33.     int getPub() { return m_nPub; }  
  34.     int getPtd() { return m_nPtd; }  
  35.     int getPrt() { return m_nPrt; }         //B  
  36. };  
  37.   
  38. class Child3 : private Parent  
  39. {  
  40. public:  
  41.     int getPub() { return m_nPub; }  
  42.     int getPtd() { return m_nPtd; }  
  43.     int getPrt() { return m_nPrt; }         //C   
  44. };  
  45.   
  46. int main()  
  47. {  
  48.     Child1 cd1;  
  49.     Child2 cd2;  
  50.     Child3 cd3;  
  51.       
  52.     int nval = 0;  
  53.       
  54.     cd1.m_nPub = nval;                      //D  
  55.     cd1.m_nPtd = nval;                      //E  
  56.     nval = cd1.getPtd();                    //F  
  57.       
  58.     cd2.m_nPub = nval;                      //G  
  59.     nval = cd2.getPtd();                    //H  
  60.       
  61.     cd3.m_nPub = nval;                      //I  
  62.     nval = cd3.getPtd();                    //J  
  63.       
  64.     return 0;  
  65. }  

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++继承

[cpp]  view plain  copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. class base  
  6. {  
  7.     int i;  
  8. public:  
  9.     base(int x) { i = x; }  
  10. };  
  11.   
  12. class derived : public base  
  13. {  
  14.     int i;  
  15. public:  
  16.     derived(int x, int y) { i = x; }  
  17.     void printTotal()  
  18.     {  
  19.         int total = i + base::i;  
  20.         cout<<"total = "<<total<<endl;  
  21.     }  
  22. };  
  23.   
  24. int main()  
  25. {  
  26.     derived d(1, 2);  
  27.     d.printTotal();  
  28.       
  29.     return 0;  
  30. }  
这个程序有如下两个错误:

(1)在derived类进行构造时,它首先要调用其基类的构造方法,由于没有指明何种构造方法,因此默认调用base类不带参数的构造方法。然而,基类base中已经定义了带一个参数的构造函数,所以编译器就不会给它定义默认的构造函数了。因此代码第16行会出现找不到构造方法的编译错误。解决办法,在derived的构造函数添加基类的构造函数。

(2)在derived类的printTotal()中,使用base::i的方式调用base类的私有成员i,这个会得到“不能访问私有成员”的编译错误,解决办法,将i设为public。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值