C++ NonPublic Inheritance

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


    		    C++ NonPublic Inheritance

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. private:
  6. Uncopyable(const Uncopyable&); // ...but prevent copying
  7. Uncopyable& operator=(const Uncopyable&);
  8. };
  9. class HomeForSale: private Uncopyable { // class no longer
  10. ... // declares copy ctor or
  11. };

上面的禁止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. class Foo {
  7. public:
  8. Foo(int f);
  9. ~Foo();
  10. private:
  11. DISALLOW_COPY_AND_ASSIGN(Foo);
  12. };

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

ClassDemo.h

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

ClassDemo.cpp

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

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. p_demo1->Dump();//base
  6. p_demo1->VDump();//base
  7. //p_demo2->Dump();//base
  8. //p_demo2->VDump();//D1
  9. d1.Dump();
  10. d1.VDump();
  11. p_demo3->Dump();//base
  12. p_demo3->VDump();//D2
  13. delete p_demo1;
  14. //delete p_demo2;
  15. delete p_demo3;

Result:




    		    C++ NonPublic Inheritance

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

更多相关文章
一周排行
  • 我在深圳一家公司里当普通职员,4000元是我扣税扣保险后的全部工资奖金,全年大约5万年收入. 作为一个本科学历,几年工龄的辦公室职员来说,这个待遇很普通,也很普遍,工资高的人也有很多,但基本上是管理和高级技术人员,工
  • 1.下载xdebug文件 http://xdebug.org/wizard.php 将phpinfo()的源代码到文本框中,xdebug会提示如何配置和下载哪个版本的xdebug. 全部下载地址: http://ww ...
  • centos7防火墙不再采用iptables命令,改用firewalld 禁用防火墙命令: # systemctl stop firewalld.service # systemctl disable firewal ...
  • 


    		    PowerShell嘗試登錄SQL Server
    前三篇文章中创建了PSNet程序集,其中包含了对指定IP进行端口扫描,收发TCP消息包和收
  • 今天我想要配置在eclipse环境下的c/c++开发环境,花了很长时间,以为没有经验,网上很多解决辦法和安装步骤是在windows下面的,有些不一样,所以记录下来.第一步是直接在软件中心下安装eclipse这个很简单 ...
  • MY_URL="http://www.youwebsite.com/"RESULT=`curl -I $MY_URLgrep "HTTP/1.1 502"`if [ -n &q ...
  • from:http://danshipper.com/non-technical-people-cant-estimate-developmen “So the site’s pretty simple, all i
  • SQL中的循環、for循環、遊標
    我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加. ...
  • 输入ulimit -a 如果core file size为0,那就说明没有打开core dump,尽管你的程序crash的时候会显示core dumped,但实际上不会生成core file 输入ulimit -c
  • ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护