2011-10-18 83 views
0

我该怎么做?我想到了复杂类中的一种方法,它将基本对象的每个变量都复制到复杂对象上,但这似乎有点不方便。将基础类的对象扩展为复杂类的对象

class Basic 
{ 
    //basic stuff 
} 

class Complex : public Basic 
{ 
    //more stuff 
} 

Basic * basicObject = new Basic(); 
//now "extending" basicObject and "cast" it to Complex type 
//which means copy everything in basicObject to an complexObject 

或类似的东西:

Complex * complexObject = new Complex(); 
complexObject.getEverythingFrom(basicObject); 

似乎是太不方便了,因为每次我改变基本类,我必须得改变这种“复制”的方法。

+0

我不认为你问的东西有很大的意义。也许更好地陈述你的目标,而不是你决定成为第一步。 –

+0

你应该多读一点继承以及它是如何工作的。 –

+0

你不能这样做。当你创建一个'Basic'对象时,你不能强制转换为派生的'Complex'。此外,每个派生类都将自己的基类变量作为自己的变量。为什么你需要执行这个副本,如果你可以直接访问所有的基础变量? –

回答

1

定义要在保护部分的类之间共享像这样的价值观:

class Base 
{ 
public: 
int myPublicShared1; 
int myPublicShared2; 

Base& operator = (Base& other) 
{ 
    // Copy contents in base across 
    return *this; 
} 
protected: 
int myShared1; 
int myShared2; 

private: 
int notShared1; 
int notShared2; 
}; 

class Derived : public Base 
{ 
public: 
Derived& operator = (Derived& other) 
{ 
    Base::operator = (other); 
    // copy the rest of variables specific to Derived class. 
} 
Derived& operator = (Base& other) 
{ 
    Base::operator = (other); 
} 
// Derived now has all variables declared in Base's public and protected section 
}; 
+0

谢谢。这看起来相当不错,但不幸的是我的Base类没有=运算符,但我将其标记为解决方案,因为它似乎是最方便的解决方案。 – ben

+0

@ben:我添加了赋值操作符来表明它必须被添加。你可以使用'(* complexObject)= * baseObject'。或者你甚至可以将该函数重命名为'Base :: assign(const Base *)'和'Derived :: assign(const Base *); Derived :: assign(const Derived *)'。然后你可以像这样使用它:'complexObject-> assign(baseObject);':)。 –

0

在C++中,对象不能改变它们的类型。

所以,要么你重写你的程序马上创建Complex对象,或者您创建一个副本构造函数,这样就可以做到:

新大楼(* basicObject);

附注:从扩展和新的使用看来,你似乎来自一个Java世界。不要认为你在java中做事情的方式也是你在C++中如何做的错误。

+0

好吧,这就像我的复制方法的想法,只是在构造函数,对不对? – ben

+0

@ben:复制ctor是使用C++中的对象时的一个基本元素,你应该读一下它。 – PlasmaHH