在下面的代码中,foo
按值返回a类对象。我能否在不方便交互的情况下将其转换为类型B的对象?(注:类A包含了所有的数据/存储成员,类B只引入了更多的方法)
class A{
/*data*/
A foo(...);
};
class B: public A
{
/*no-data*/
B doMagic(...);
};
/*usage*/
B bone;
B btwo = bone.foo(...) /*wo cast*/
提前感谢!
你不能,你写的方式没有意义;还有语法错误
您不能将实际的基对象转换为派生对象,通常也不能明智地采用另一种方式。通常可以做的事情是转换指针和引用。
在您的情况下,您通常会在虚函数上使用协变返回值:
struct A
{
virtual A * foo();
};
struct B : A
{
virtual B * foo(); // OK, this _overrides_ A::foo()
};
int main()
{
B x;
B * p = x.foo(); // no cast
}
在采用这种方法时,您需要仔细考虑许多细节。这当然是可行的,但你必须把很多事情做好。您可能需要几个自定义构造器来使B::foo()
做任何合理的事情。
我认为你做不到。A::foo
返回一个A
,这就是它的定义,这就是它的作用。即使B
没有包含额外的数据,我不认为c++可以知道。
你可以尝试以下几种选择:
有一个B
构造函数,它从a参数创建。虽然我猜这实际上是一种强制转换。
class B, public A
{
/*no-data*/
B( const A& param );
B doMagic(...);
};
/*usage*/
B bone;
B btwo = bone.foo(...);
或者另一种策略,使doMagic
成为一个静态方法,它在A
参数上工作。我假设这里的全部要点是您希望对A::foo
class B, public A
{
/*no-data*/
static B doMagic(A& param, ...);
};
/*usage*/
B bone;
A atwo = bone.foo(...);
B::doMagic( atwo, ... );
我不知道这些对你是否有用,但希望它们对你有帮助。