Возвращая разные подтипы с ++ - PullRequest
1 голос
/ 27 января 2020

Исходя из Java фона, у меня возникают проблемы с пониманием функций наследования c ++. Я пытаюсь написать класс, который возвращает разные подтипы, основываясь на некотором логе c внутри функции. Код объясняет лучше:

Supertype.h

class SuperType {

public:

virtual SuperType * functionA() const = 0;
};

SubTypeA.h

class SubTypeA : public SuperType{

public:

    SuperType * functionA() const override;
};

SubtypeA. cpp

SuperType * SubTypeA::functionA() const {

    if(someassertionIsTrue()){
        return new SubTypeA();
    }else{
        return new SubTypeB();
    }
}

SubTypeB. h

class SubTypeB : public SuperType{

public:

    SuperType * functionA() const override;
};

Подтип B. cpp

SuperType * SubTypeB::functionA() const {

    if(someassertionIsTrue()){
        return new SubTypeA();
    }else{
        return new SubTypeB();
    }
}

В строке return new SubTypeB появляется сообщение:

Cannot initialize return object of type 'SuperType *' with an rvalue of type 'SubTypeB *'

Итак, вопросы:

  • Этот тип логики c вообще возможен в c ++?
  • Если да, то как?

1 Ответ

1 голос
/ 27 января 2020

Если вы просто хотите решить проблему компиляции. Убедитесь, что вы включили SubTypeB.h в SubTypeA.cpp и SubTypeA.h в SubTypeB.cpp.

Возможно, вы захотите решить основную проблему, которая у вас, вероятно, есть. Вы хотите создать объект типа SubTypeB в SubTypeA и наоборот. Таким образом, класс SubTypeA нуждается в SubTypeB для компиляции и SubTypeB нуждается в SubTypeA. Таким образом, у вас есть круговая зависимость, которая почти всегда является недостатком дизайна, который вы должны решить. Поскольку определения в заголовках не зависят от другого класса, его можно скомпилировать, но это может измениться, если в будущем.

Способ устранения этого недостатка зависит от того, что вы хотите сделать, и от того, будет ли эта конструкция даже имеет смысл. Вы можете написать третий класс или просто функцию, которая реализует логику c из functionA и создает один из двух SubTypes в зависимости от условия.

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