代码之家  ›  专栏  ›  技术社区  ›  Aoi Karasu

在不知道类成员的情况下从基类实例创建派生类实例

  •  5
  • Aoi Karasu  · 技术社区  · 15 年前

    这种情况是否可能?

    class Base
    {
      int someBaseMemer;
    };
    
    template<class T>
    class Derived : public T
    {
      int someNonBaseMemer;
    
      Derived(T* baseInstance);
    };
    

    目标:

    Base* pBase = new Base();
    pBase->someBaseMemer = 123; // Some value set
    Derived<Base>* pDerived = new Derived<Base>(pBase);
    

    pDerived->somebasememer的值应与pbase->somebasememer相等,并与其他基础成员相似。

    3 回复  |  直到 15 年前
        1
  •  3
  •   MSN    15 年前

    为什么你不真正地完成代码的编写和编译呢?

    class Base 
    { 
    public: // add this
        int someBaseMemer; 
    }; 
    
    template<class T> 
    class Derived : public T 
    { 
    public: // add this
        int someNonBaseMemer; 
    
        Derived(T* baseInstance)
            : T(*baseInstance) // add this
        { return; } // add this
    }; 
    

    这将按您指定的方式编译和运行。

    编辑:或者你是说 someNonBaseMemer 应平等 someBaseMemer ?

        2
  •  4
  •   dirkgently    15 年前

    为什么要同时派生和传递基指针?选择其中之一,没有什么能阻止你同时拥有两者。使用继承为您完成工作:

    class Base
    {
      public:
        Base(int x) : someBaseMemer(x) {}
      protected:      // at least, otherwise, derived can't access this member
        int someBaseMemer;
    };
    
    template<class T>
    class Derived : public T
    {
      int someNonBaseMemer;
    
      public:
      Derived(int x, int y) : someNonBaseMemer(y), T(x) {}
    };
    
    Derived<Base> d(42, 32); // usage
    

    虽然不是最好的选择作为设计。

        3
  •  1
  •   Thomas Matthews    15 年前

    申报 someBaseMemr 公开或更改声明 class struct :

    class Base
    {
      public:
      int someBaseMemer;
    };
    
    OR
    
    struct Base
    {
      int someBaseMemr;
    };
    

    记住一个 private 默认情况下访问所有成员和方法。一 结构 提供 public 默认访问。

    此外,所有派生类都应该 公众的 继承自 Base .