2013-02-01 40 views
1

我想从基类转换为派生类。 我有下面的构造,但是,编译器抱怨:从基类转换为dervied类

no matching function for call to ‘baseObject::baseObject()’ 

构造:

derivedObject(const baseObject &base, const std::string &extra1) 
{ 
    baseparameter1 = base.baseparameter1; 
    baseparameter2 = base.baseparameter2; 
    extraparameter1 = extra1; 
} 

有什么建议?

+1

看起来像你的类'baseObject'没有默认的构造函数。我们可以看到'baseObject'吗? – Foggzie

+0

这是正确的,但它为什么需要有一个。我通过的baseobject应该已经构建好了 – marcwho

+0

派生对象的构造函数将自动调用其基类的构造函数。这不是因为你传入的'baseObject',这是因为'derivedObject'本身。 – Foggzie

回答

2

每一个构造函数通过初始化所有的基类和直接的成员开始,你到了{之前。相反,在体内使用分配,使用成员初始化列表:

derivedObject(const baseObject &base, const std::string &extra1) 
    : baseObject(base),  // Calls the baseObject copy constructor 
     extraParameter1(extra1) // Initialize the direct member 
{ 
} 

这是更好的风格,也避免了像你遇到了一个问题。

+0

啊谢谢!快速的问题,但我必须创建我自己的拷贝构造函数,或默认的一个为我复制数据成员? – marcwho

+0

@marcwho如果类没有声明任何拷贝构造函数成员,编译器会自动添加一个'public',并复制每个基类和成员。这通常足够好(但请参阅三规则)。 – aschepler

2

编辑baseObject复制构造。

由于您尚未为baseObject定义默认构造函数,编译器无法构造derivedObject,因为没有明确指定要使用哪个baseObject构造函数。

在你的derivedConstructor的定义中,那么你需要精确地指定baseObject的构造函数。因为我不知道你的baseObject是什么样子的,我下面的占位符使用:

derivedObject(const baseObject &base, const std::string &extra1) 
    : baseObject(PARAM1, PARAM2) 
{ 
    baseparameter1 = base.baseparameter1; 
    baseparameter2 = base.baseparameter2; 
    extraparameter1 = extra1; 
} 

在您的特定情况下,如果你想创建一个已经存在的baseObject一个derivedObject,你应该定义baseObject的拷贝构造函数,并做如下:

derivedObject(const baseObject &base, const std::string &extra1) 
    : baseObject(base) 
{ 
    baseparameter1 = base.baseparameter1; 
    baseparameter2 = base.baseparameter2; 
    extraparameter1 = extra1; 
} 
+0

我怀疑后者的样本可能是OP的目标。 – WhozCraig