【问题标题】:Returning different subtypes c++返回不同的子类型 c++
【发布时间】:2020-01-27 09:14:37
【问题描述】:

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

超类型.h

class SuperType {

public:

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

SubTypeA.h

class SubTypeA : public SuperType{

public:

    SuperType * functionA() const override;
};

子类型A.cpp

SuperType * SubTypeA::functionA() const {

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

子类型B.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++ 中是否可行?
  • 如果是,怎么做?

【问题讨论】:

  • SubTypeASubTypeB both 是否都继承自 SuperType?请创建minimal reproducible example 向我们展示。
  • @Someprogrammerdude 是的
  • 在一个不相关的注释中,如果functionA 在两个子类中做同样的事情,为什么要在子类中覆盖它?为什么不只在基类中实现呢?
  • 您的代码(按正确顺序组合在一起)works for me。您是否在两个源文件中都包含 SubTypeA.hSubTypeB.h 头文件?你有任何类的任何前向声明吗? SubtypeA.cppSubtypeA.cpp 源文件是否出现相同的错误?

标签: c++ inheritance covariant-return-types


【解决方案1】:

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

您可能想解决您可能遇到的根本问题。 您想在SubTypeA 中创建SubTypeB 类型的对象,反之亦然。所以类SubTypeA需要SubTypeB来编译,SubTypeB需要SubTypeA。所以你有一个循环依赖,这几乎总是你必须解决的设计缺陷。由于标头中的定义不依赖于其他类,因此您可以编译它,但如果将来这可能会改变。

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

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多