zoukankan      html  css  js  c++  java
  • effective c++:private继承

    如果class间使用private继承关系,编译器就不会自动的将派生类转换为基类,而且private继承而来的成员都变为private属性。

    private继承意味着根据某物实现出,当我们想要避免重复代码,使用现有的代码时,就可以使用private继承。

    class Widget: private Timer {
     private:
        virtual void onTick() const; // look at Widget usage data, etc.
        ...
    };

    例如类widget需要使用到onTick函数,刚好发现Timer中以实现了这个函数,但Widget不是一个Timer,所以使用public 继承不合理,所以我们需要以private来继承Timer。但是这里的priavte继承有一些缺点,第一:当我们实现Widget的派生类的时候,可能我们还想阻止派生类重定义onTick函数,使用private继承则无法实现它。我们可以在Widget类内定义一个private class继承Timer,这样Widget的派生类就无法使用onTick函数,当然在c++11中已经有final关键字来阻止派生类对基类虚函数的重定义。

    class Widget {
    private:
      class WidgetTimer: public Timer {
      public:
      virtual void onTick() const;
      ...
    };
    WidgetTimer timer;
      ...
    };

    第二:当我们要将编译依存关系降低时,如果使用private继承,Widget编译时必须看到Timer的定义,即必须写上#include “Timer.h”.另一方面,如果 WidgetTimer 移出 Widget 而 Widget 只包含一个指向一个 WidgetTimer 的 pointer(指针),Widget 就可以只需要 WidgetTimer class(类)的一个简单的 declaration(声明);为了使用 Timer 它不需要 #include 任何东西。

    private可以在多重继承中使用,当涉及"public 继承某个interface class" 和 “private继承某个协助实现的class”时

    class IPerson { // this class specifies the
    public: // interface to be implemented
      virtual ~IPerson();
      virtual std::string name() const = 0;
      virtual std::string birthDate() const = 0;
    };
    class DatabaseID { ... }; // used below; details are
    // unimportant
    class PersonInfo { // this class has functions
    public: // useful in implementing
      explicit PersonInfo(DatabaseID pid); // the IPerson interface
      virtual ~PersonInfo();
      virtual const char * theName() const;
      virtual const char * theBirthDate() const;
      ...
    private:
      virtual const char * valueDelimOpen() const;
      virtual const char * valueDelimClose() const;
      ...
    };
    class CPerson: public IPerson, private PersonInfo { // note use of MI
    public:
      explicit CPerson(DatabaseID pid): PersonInfo(pid) {}
      virtual std::string name() const // implementations
      { return PersonInfo::theName(); } // of the required
      // IPerson member
      virtual std::string birthDate() const // functions
      {  return PersonInfo::theBirthDate(); }
    private: // redefinitions of
      const char * valueDelimOpen() const { return ""; } // inherited virtual
      const char * valueDelimClose() const { return ""; } // delimiter
    };
  • 相关阅读:
    mybatis学习坑路
    一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别
    servlet的坑
    class.getResource()方法的更新 坑
    utf8和字节数组的转换
    finally模块的各种情况
    C++ 动态对象数组的知识总结
    Notepad++正则表达式语法
    诸子百家55句
    给初始化为NULL的结构体指针赋值报错问题
  • 原文地址:https://www.cnblogs.com/loujiayu/p/3687437.html
Copyright © 2011-2022 走看看