返回不同的子类型 C++

Returning different subtypes c++

来自 Java 背景,我无法理解 C++ 的继承功能。我正在尝试根据函数内部的某些逻辑编写一个 class returns 不同的子类型。代码解释得更好:

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;
};

SubtypeB.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 *'

所以问题:

如果你只是想解决编译问题。检查您是否在 SubTypeA.cpp 中包含了 SubTypeB.h 并且在 SubTypeB.cpp 中包含了 SubTypeA.h

您可能想解决您可能遇到的潜在问题。 您想要在 SubTypeA 和 visa-versa 中创建类型 SubTypeB 的 object。所以 class SubTypeA 需要 SubTypeB 来编译,SubTypeB 需要 SubTypeA。所以你有一个循环依赖,这几乎总是你必须解决的设计缺陷。由于 headers 中的定义不依赖于其他 class 您可以编译它,但如果将来这可能会改变。

如何解决这个缺陷取决于你想做什么以及这个构造是否有意义。您可以编写第三个 class 或只是一个实现 functionA 逻辑并根据条件创建两个 SubTypes 之一的函数。