c++方法的继承和返回值



在下面的代码中,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

的结果运行dommagic方法。
class B, public A
{
    /*no-data*/
    static B doMagic(A& param, ...);
};
/*usage*/
B bone;
A atwo = bone.foo(...);
B::doMagic( atwo, ... );

我不知道这些对你是否有用,但希望它们对你有帮助。

最新更新