今天同事聊起C++的非公有继承,发现自己知识又有些模糊了。晚上回来Demo温习一下

Basic Rule:公有继承用于接口继承,反映"is-a"关系;非公有继承用于方法继承实现和方法封装性控制。

引CSDN一段关于非公有继承使用情景的说明:

私有继承:

 

第一个规则:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象转换成基类对象。

第二个规则: 从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。私有继承的含义:私有继承意味着 "用...来实现"。如果使类D私有继承于类B,这样做是因为你想利用类B中已经存在的某些代码,而不是因为类型B的对象和类型D的对象之间有什么概念上的关系。因而,私有继承纯粹是一种实现技术。私有继承意味着只是继承实现,接口会被忽略。如果D私有继承于B,就是说D对象在实现中用到了B对象,仅此而已。私有继承在软件 "设计" 过程中毫无意义,只是在软件 "实现" 时才有用。

私有继承控制实现的一个例子:

   
   
   
   
  1. class Uncopyable { 
  2. protected:                                   // allow construction 
  3.   Uncopyable() {}                            // and destruction of 
  4.   ~Uncopyable() {}                           // derived objects... 
  5.  
  6. private
  7.   Uncopyable(const Uncopyable&);             // ...but prevent copying 
  8.   Uncopyable& operator=(const Uncopyable&); 
  9. }; 
  10.  
  11. class HomeForSale: private Uncopyable {      // class no longer 
  12.   ...                                        // declares copy ctor or 
  13. };   

 

上面的禁止Copy/Assignment Constructor当然也可以使用下面方法实现:

   
   
   
   
  1. // A macro to disallow the copy constructor and operator= functions 
  2. // This should be used in the private: declarations for a class 
  3. #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ 
  4.   TypeName(const TypeName&);               \ 
  5.   TypeName& operator=(const TypeName&) 
  6.  
  7. class Foo { 
  8.  public
  9.   Foo(int f); 
  10.   ~Foo(); 
  11.  
  12.  private
  13.   DISALLOW_COPY_AND_ASSIGN(Foo); 
  14. }; 

最后附上一段阳春的Demo Code参考:

ClassDemo.h

   
   
   
   
  1. class ClassDemo 
  2. public
  3.     ClassDemo(void); 
  4.     ~ClassDemo(void); 
  5.  
  6.     void Dump(void); 
  7.     virtual void VDump(void); 
  8.  
  9. protected
  10.     void PDump(void); 
  11.  
  12. private
  13.     void PRDump(void); 
  14. }; 
  15.  
  16. class ClassD1 : private ClassDemo 
  17. public
  18.     ClassD1(void){} 
  19.     ~ClassD1(void){} 
  20.     void Dump(void); 
  21.     virtual void VDump(void); 
  22.  
  23. }; 
  24.  
  25. class ClassD2 : public ClassDemo 
  26. public
  27.     ClassD2(void){} 
  28.     ~ClassD2(void){} 
  29.     void Dump(void); 
  30.     virtual void VDump(void); 
  31. }; 

ClassDemo.cpp

   
   
   
   
  1. #include  
  2.  
  3. #include "ClassDemo.h" 
  4.  
  5. ClassDemo::ClassDemo(void
  6.  
  7. ClassDemo::~ClassDemo(void
  8.  
  9. void ClassDemo::Dump() 
  10.     std::cout<<__FUNCTION__<
  11.  
  12. void ClassDemo::VDump() 
  13.     std::cout<<__FUNCTION__<
  14.  
  15. void ClassDemo::PDump() 
  16.     std::cout<<__FUNCTION__<
  17.  
  18. void ClassDemo::PRDump() 
  19.     std::cout<<__FUNCTION__<
  20.  
  21. void ClassD1::Dump() 
  22.     //this->PRDump(); //error C2248: cannot access private member 
  23.     this->PDump(); 
  24.     std::cout<<__FUNCTION__<
  25.  
  26. void ClassD1::VDump() 
  27.     std::cout<<__FUNCTION__<
  28.  
  29. void ClassD2::Dump() 
  30.     this->PDump(); 
  31.     std::cout<<__FUNCTION__<
  32.  
  33. void ClassD2::VDump() 
  34.     std::cout<<__FUNCTION__<

main.cpp

   
   
   
   
  1. ClassDemo *p_demo1 = new ClassDemo(); 
  2. //ClassDemo *p_demo2 = new ClassD1();//error C2243: 'type cast' 
  3. ClassD1 d1; 
  4. ClassDemo *p_demo3 = new ClassD2(); 
  5.  
  6. p_demo1->Dump();//base 
  7. p_demo1->VDump();//base 
  8. //p_demo2->Dump();//base 
  9. //p_demo2->VDump();//D1 
  10. d1.Dump(); 
  11. d1.VDump(); 
  12. p_demo3->Dump();//base 
  13. p_demo3->VDump();//D2 
  14.  
  15. delete p_demo1; 
  16. //delete p_demo2; 
  17. delete p_demo3; 

Result:

C++ Non-Public Inheritance_第1张图片

P.S. 抽空该温习一下Effective C++啦,囧