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

时间:2010-02-26 21:22:13

标签: c++ visual-c++ inheritance templates

这种情况甚至可能吗?

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-&gt; someBaseMemer的值应该是pBase-> someBaseMember的equeal,与其他基本成员类似。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

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 :(得分:1)

someBaseMemr声明为公开或将声明从class更改为struct

class Base
{
  public:
  int someBaseMemer;
};

OR

struct Base
{
  int someBaseMemr;
};

请记住,class默认情况下private具有struct个所有成员和方法的访问权限。 public默认提供public访问权限。

此外,所有派生类都应该Base继承{{1}}。