2010-02-26 136 views
5

这种情况甚至可能吗?从基类实例创建派生类实例而不知道类成员

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应equeal到pBase-> someBaseMember并与其他基体类似。

+3

为什么你想要这样一个扭曲的事情? – GManNickG 2010-02-26 21:27:32

+0

StackOverflowException?大声笑....在一个严肃的说明......这不会编译。 – 2010-02-26 21:29:43

+0

@Elite:实际上,如果你将会员更改为公开的话。尽管如此,并没有让它变得更恐怖。 – 2010-02-26 21:34:54

回答

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

+0

派生(T * baseInstance):T(* baseInstance)是解决方案。我尝试了T(baseInstance)并陷入了编译器错误。编译器涉及模板的错误消息,例如。 SomeClass :: NestedClass :: blablah给我的毛骨悚然。谢谢。 – 2010-02-26 22:07:39

+0

这里还有一个很好的答案,但已被删除。我不知道为什么。派生(const T&baseInstance):T(baseInstance)也是一个很好的提示,但不适合我的特殊情况。在我的问题中的例子只是一些更大的东西的一小部分。 – 2010-02-26 22:11:13

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 

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

+0

令我惊讶的是,渴望的人如何投票回答错过了这一点。当Base类有更多成员时,Derived(int,int)构造函数有什么意义?在您的示例类Derived中:public Base会更好,因为Derived类必须识别Base类的成员。但它仍然没有回答我的问题。 – 2010-02-26 22:21:15

+1

不幸的是,您完全错过了我的观点,即让编译器进行复制。你的例子是一团糟 - 这并不能帮你解决问题。 – dirkgently 2010-02-26 22:24:06

+0

幸运的是有人能够理解我的混乱并回答我的问题。 – 2010-02-26 22:44:31

1

申报someBaseMemr公共或更改classstruct声明:

class Base 
{ 
    public: 
    int someBaseMemer; 
}; 

OR 

struct Base 
{ 
    int someBaseMemr; 
}; 

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

此外,所有派生类应具有从Base继承public

+0

海报的技巧是一种模式,它允许更改基类或派生类的派生路径。我也使用过这种技术。 – 2010-02-26 21:45:23