我有类似的东西:
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改成很多,而它是由其他人写的。
由于
答案 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
不会编译,我不知道“Foo
和Base
之间的锻炼”是什么意思。请花点时间创建一个正确的示例,其中(仅)显示您遇到的问题,并提供您所看到的内容和期望的准确描述。问题就是这样,我不知道从哪里开始告诉你你做错了什么。我建议你改变你的问题,以显示一些编译的代码(除了你有的问题)。
然后我可以编辑这个答案,以便它解释发生了什么。