C ++ наследование и возвращаемые значения метода - PullRequest
0 голосов
/ 09 ноября 2011

В приведенном ниже коде 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(...) /*w\o cast*/

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Вы не можете, и это не имеет смысла, как вы написали это;и вы также получили синтаксические ошибки.

Вы не можете преобразовать фактические базовые объекты в производные объекты, и вы обычно не можете разумно пойти и другим путем.Обычная вещь, которую вы можете сделать, - это конвертировать указатели и ссылки.

В вашем случае вы обычно используете ковариантное возвращаемое значение для виртуальной функции:

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() сделать что-нибудь разумное.

1 голос
/ 09 ноября 2011

Не думаю, что ты можешь. A::foo возвращает A, вот как оно определено, вот что он делает. Даже если B не содержит никаких дополнительных данных, я не думаю, что C ++ может это знать.

Несколько альтернатив, которые вы могли бы попробовать вместо:

Иметь B подрядчика, который создает из параметра А. Хотя я думаю, что это действительно актерский состав.

class B, public A
{
    /*no-data*/
    B( const A& param );
    B doMagic(...);
};

/*usage*/
B bone;
B btwo = bone.foo(...);

Или другая стратегия, сделайте doMagic статическим методом, который работает с параметром A. Я предполагаю, что весь смысл в том, что вы хотите запустить метод doMagic для результата A::foo

class B, public A
{
    /*no-data*/
    static B doMagic(A& param, ...);
};

/*usage*/
B bone;
A atwo = bone.foo(...);
B::doMagic( atwo, ... );

Не знаю, сработают ли они для вас, но, надеюсь, они помогут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...