2009-09-21 93 views
1

我有类似的东西:C++ - 克隆基类

Class Foo : Base {.."my stuph" ..}; 

int main() { 
    Base *b = new Base; 
    Foo f (b); <== **error** "invalid conversion from Base to Foo." 
    .. 
} 

我如何可以克隆B至F?
在“我的阴影”中,我有在Foo和Base之间进行锻炼的功能。
我不能改变基地,虽然它是由他人写的。

感谢

+0

你为什么不这样做:Foo * f = new Foo;? – 2009-09-21 12:51:25

+2

基数b =新基数;看起来很奇怪我 – MadH 2009-09-21 12:51:59

+0

修订:看* Java *给我。 – 2009-09-21 12:55:12

回答

5

你不能自动派生一个派生类。但是,反过来也可以创建基类,但这可能会让您感到困惑。

做你想做什么,你应该添加适当的构造函数Foo,并认为你将如何实际创建信息在Base实例失踪构成一个全功能的Foo实例。

构造可以是这样的:

Foo(Base const& b) : Base(b) 
{ /* construct info specific to Foo (absent in Bar) */ } 
+0

谢谢,这是非常明确的解释。 – name 2009-09-21 14:02:23

4

定义一个构造函数类型库的参数:

Foo(const Base & b) 
: Base(b) // construct the base class, using its copy constructor 
{ 
    // plus, initialize Foo-specific member data here 
} 

BTW:你确定你想要基地是私人的基类?

+4

那么,如果你要选择尼特,“你确定'class'关键字是大写?”。 “你确定你想让b被堆分配吗?”。 “你确定你可以把'new B'的结果赋给一个'B'类型的变量?”。我认为所有这些东西的答案是“不”;-) – 2009-09-21 12:54:40

+0

嗯,我错过了类关键字是大写。无论如何,编译器会抱怨它,所以我确信它是一个错字。但是,通过省略访问说明符来使基类保持私有状态是完全合法的,但是如果不是有意的话,这会非常混乱,所以我想指出它。 – 2009-09-21 12:59:20

+1

@tkopec:问题是代码包含比其他任何更多的错别字。虽然你的建议很好,但我有些怀疑这是马里乌斯想要的。毕竟这不是克隆操作。但是呢 - 他似乎对克隆概念很模糊。 – sbi 2009-09-21 13:23:29

1

提供一个构造函数,它接受一个基类或对其的引用。

1

给富构造,这需要基本参数:

class Foo : public Base { 
public: 
    explicit Foo(const Base &b) { 
     // do work to initialise Foo. You might want to include 
     Base::operator=(b); 
     // or you might not. Depends how Foo works, and what Base's 
     // constructors do. 
    } 
}; 

当你写一个参数的构造函数,就应该考虑是否要指定“明确的”。

“显式”是否可以说构造函数只应用于您已经明确写出构造函数调用或强制转换的地方。如果它不存在,那么编译器也会“暗示”在下列情况下转换基本对象来富,例如:

int doSomething(const Foo &f) { 
    return 23; 
} 

Base b; 
doSomething(b); // doesn't compile 
doSomething(static_cast<Foo>(b)); // does compile 

如果去掉了“明确的”,然后doSomething(b)将汇编,并做同样的作为第二行 - 从b构造一个临时Foo对象,并将其传递给doSomething。

1

克隆操作是,它提供的对象的精确副本。将Base转换为Foo将不是克隆操作。

在你的问题,class是用大写“C”,Foo从基地私下派生,它的成员(对这个问题很重要)不会显示,Base b = new Base不会编译,我不知道“ “FooBase之间的锻炼”应该是指。请花时间创建一个正确的示例,以显示(仅)您遇到的问题,并提供您所看到的和您所期望的内容的准确描述。由于这个问题,我不确定从哪里开始告诉你你做错了什么。我建议你改变你的问题来显示一些编译的代码(除了你有问题)。

然后我可能可以编辑这个答案,以便它解释发生了什么。