返回不同的子类型 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 *'
所以问题:
- 这种逻辑在 C++ 中是否可行?
- 如果是,怎么做?
如果你只是想解决编译问题。检查您是否在 SubTypeA.cpp
中包含了 SubTypeB.h
并且在 SubTypeB.cpp
中包含了 SubTypeA.h
。
您可能想解决您可能遇到的潜在问题。
您想要在 SubTypeA
和 visa-versa 中创建类型 SubTypeB
的 object。所以 class SubTypeA
需要 SubTypeB
来编译,SubTypeB
需要 SubTypeA
。所以你有一个循环依赖,这几乎总是你必须解决的设计缺陷。由于 headers 中的定义不依赖于其他 class 您可以编译它,但如果将来这可能会改变。
如何解决这个缺陷取决于你想做什么以及这个构造是否有意义。您可以编写第三个 class 或只是一个实现 functionA
逻辑并根据条件创建两个 SubTypes
之一的函数。
来自 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 *'
所以问题:
- 这种逻辑在 C++ 中是否可行?
- 如果是,怎么做?
如果你只是想解决编译问题。检查您是否在 SubTypeA.cpp
中包含了 SubTypeB.h
并且在 SubTypeB.cpp
中包含了 SubTypeA.h
。
您可能想解决您可能遇到的潜在问题。
您想要在 SubTypeA
和 visa-versa 中创建类型 SubTypeB
的 object。所以 class SubTypeA
需要 SubTypeB
来编译,SubTypeB
需要 SubTypeA
。所以你有一个循环依赖,这几乎总是你必须解决的设计缺陷。由于 headers 中的定义不依赖于其他 class 您可以编译它,但如果将来这可能会改变。
如何解决这个缺陷取决于你想做什么以及这个构造是否有意义。您可以编写第三个 class 或只是一个实现 functionA
逻辑并根据条件创建两个 SubTypes
之一的函数。