从其他子类构造子类

时间:2018-06-07 09:46:44

标签: c++ oop inheritance

我有以下类架构:

            Pokemon
              |
  --------------------------- ...  -------- ...
 |            |                         |
Bulbasaur     Charamander     ...     Ditto ...

我想从Pokemon的实例创建一个新的Ditto类,如:

new Charamander(Ditto);

为此,我的想法是使用超类构造函数:

new Charamander(Pokemon);

Pokemon是{{1>} 超类

但我不知道如何访问我的Ditto 超类来提供Ditto的构造函数。

1 个答案:

答案 0 :(得分:2)

如果你想构建一个类的实例作为兄弟类的副本,那么我看到两个选项:

  1. 每个派生类都必须为每个兄弟类提供(复制?)构造函数。

  2. 每个派生类都必须提供一个从其常用超类中复制的构造函数。

  3. 后者听起来更好,因为它减少了要写入的代码量(并且可能会在以后导致更少的维护问题)。

    当然,第三个选项是派生类是否必要。

    但是,我为2 nd 选项做了一些示例:

    #include <iostream>
    #include <string>
    
    class Pokemon {
      private:
        static int _idGen;
      protected:
        int _id;
      public:
        Pokemon(): _id(++_idGen) { }
        Pokemon(const Pokemon&) = default;
        virtual const char* what() const = 0;
    };
    
    int Pokemon::_idGen;
    
    class Ditto: public Pokemon {
      public:
        Ditto(): Pokemon()
        {
          std::cout << "Ditto created. (ID: " << _id << ")\n";
        }
        Ditto(const Pokemon &other): Pokemon(other)
        {
          std::cout << "Ditto cloned from " << other.what() << " (ID: " << _id << ").\n";
        }
        virtual const char* what() const override { return "Ditto"; }
    };
    
    class Charamander: public Pokemon {
      public:
        Charamander(): Pokemon()
        {
          std::cout << "Charamander created. (ID: " << _id << ")\n";
        }
        Charamander(const Pokemon &other): Pokemon(other)
        {
          std::cout << "Charamander cloned from " << other.what() << " (ID: " << _id << ").\n";
        }
        virtual const char* what() const override { return "Charamander"; }
    };
    
    int main()
    {
      Charamander char1;
      Ditto ditto1;
      Charamander char2(ditto1);
      Ditto ditto2(char1);
      return 0;
    }
    

    输出:

    Charamander created. (ID: 1)
    Ditto created. (ID: 2)
    Charamander cloned from Ditto (ID: 2).
    Ditto cloned from Charamander (ID: 1).
    

    Live Demo on coliru

    抱歉,如果我混合了口袋妖怪的话。并不是说我知道这些东西的一切,除了有这个漫画系列(以及它周围的所有商品)......

    关于免费的C ++书籍:你可以通过谷歌c++ book online找到一些。如果您对质量有疑问,请改用Google good c++ book online ...