C++的私有继承、公有继承和保护继承

  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. class Animal  
  6. {  
  7.     protected:  
  8.         int test;  
  9.         void sleep(){cout << "animal sleep...\n";}  
  10.     public:  
  11.     Animal(){ test = 0; cout << "animal init...\n";}  
  12.     void eat(){cout << "Animal eat..." << endl;}  
  13. };  
  14.   
  15. class Giraffe: private Animal  
  16. {  
  17.     public:  
  18.         Giraffe(){cout << "giraffe init...\n";}  
  19.         void StrechNeck(double)  
  20.         {  
  21.             eat();  
  22.              sleep();  
  23.             cout << "test: "<<test << endl;  
  24.             cout << "strech neck \n"<<endl;  
  25.         }  
  26. };  
  27.   
  28. class dog: protected Animal  
  29. {  
  30.     public:  
  31.         dog(){cout << "dog init...\n";}  
  32.         void run(double)  
  33.         {  
  34.             cout << "dog run start .... \n";  
  35.             eat();  
  36.              sleep();  
  37.             cout << "test: "<<test << endl;  
  38.             cout << "dog run end .... \n";  
  39.         }  
  40. };  
  41.   
  42. class Cat: public Animal  
  43. {  
  44.     public:  
  45.     Cat(){cout << "cat init...\n";}  
  46.    // void eat(){cout << "cat eat ...\n";}  
  47.     void Meaw(){  
  48.         eat();  
  49.         sleep();  
  50.         cout << "meaw\n";}  
  51. };  
  52.   
  53. void Func(Animal& an)  
  54. {  
  55.     an.eat();  
  56. }  
  57. int main()  
  58. {  
  59.     Cat dao;  
  60.     Giraffe gir;  
  61.     dog dg;  
  62.     Func(dao);  
  63.     //Func(dg);//error  
  64.     dao.Meaw();  
  65.     dg.run(11);  
  66.     //dao.sleep();  //error  
  67.     cout << "==========================\n";  
  68.     gir.StrechNeck(12);  
  69.    // Func(gir); //error  
  70.     return 0;  
  71. }  



运行结果:

总结:

1. 不管是私有继承还是公有继承都无法访问父类的私有成员;

2. 公有继承的子类对象,可以直接访问父类的public的成员,就如同访问自己的成员一样;

3. 私有继承的子类对象,不能直接访问父类的任何成员;

4. 私有继承的子类对象,如果想要访问父类成员,只能通过子类的成员函数来访问父类的成员,就如同父类成员函数访问自己的成员(当然,父类的private成员无法访问)。

5. 保护继承与私有继承类似,继承之后的类相对于父类是独立的;其类对象,在公开场合无法使用基类的成员,也只能通过自己的成员函数来访问父类的protected和public成员。

下面分类说明:

(一)公有继承

1. 基类成员对派生类的可见性 对于 派生类来说,基类的公有成员和保护成员可见,私有成员不可见;

2. 基类成员对于派生类对象的可见性 对于 派生类对象来说,派生类对象 可以访问基类的公有成员,派生类的成员函数可以访问基类的公有成员和保护成员。

(二)私有继承

1. 基类成员对于派生类的可见性 对 派生类 来说,基类的公有成员和保护成员是可见的,基类的公有成员和保护成员都作为派生类的私有成员,并且不能够被这个派生类的子类所访问;基类的私有成员是不可访问的;

2. 基类成员对于派生类对象的可见性来说,基类的所有成员都不可见。

(三)保护继承

1. 基类成员对于派生类的可见性 对 派生类 来说,基类的公有成员和保护成员是可见的,基类的公有成员和保护成员都作为派生类的私有成员,并且不能够被这个派生类的子类所访问;基类的私有成员是不可访问的;

2. 基类成员对于派生类对象的可见性来说,基类的所有成员都不可见。

所以,私有继承和保护继承的派生类,其子类均无法访问基类成员,导致基类无法再往下继承。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值