C ++ - 克隆基类

时间:2009-09-21 12:48:35

标签: c++ clone

我有类似的东西:

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

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

如何将b克隆到f?
在“我的stuph”中,我有在Foo和Base之间进行锻炼的功能 我不能把Base改成很多,而它是由其他人写的。

由于

5 个答案:

答案 0 :(得分:5)

您不能自动从基础类创建派生类。你可以反之亦然,然后从派生中创建一个基类,这可能会让你感到困惑。

要执行您想要的操作,您应该向Foo添加适当的构造函数,并考虑如何在Base实例中实际创建缺少的信息以构成功能齐全的Foo实例。

构造函数可能如下所示:

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

答案 1 :(得分:4)

定义一个带有Base类型参数的构造函数:

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

BTW:您确定要将Base作为私人基类吗?

答案 2 :(得分:1)

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

答案 3 :(得分:1)

给Foo一个带有Base参数的构造函数:

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.
    }
};

每当你编写一个单参数构造函数时,你应该考虑是否要指定“explicit”。

“explicit”是指构造函数只应在显式编写构造函数调用或强制转换的地方使用。如果不存在,那么编译器也会“隐式”将Base对象转换为Foo,例如在以下情况下:

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

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

如果删除了“explicit”,那么doSomething(b)将编译,并且与第二行相同 - 从b构造一个临时Foo对象,并将其传递给doSomething。

答案 4 :(得分:1)

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

在您的问题中,class拼写为大写字母'C',Foo私下派生于Base,其成员(对此问题很重要)未显示,Base b = new Base不会编译,我不知道“FooBase之间的锻炼”是什么意思。请花点时间创建一个正确的示例,其中(仅)显示您遇到的问题,并提供您所看到的内容和期望的准确描述。问题就是这样,我不知道从哪里开始告诉你你做错了什么。我建议你改变你的问题,以显示一些编译的代码(除了你有的问题)。

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