【发布时间】:2019-12-20 15:26:51
【问题描述】:
问题
让成员函数返回类型成为您想要返回的实际对象的超类的正确方法是什么?
问题
Clang tidy 警告我返回 subClassA 或 subClassB 会丢弃我对 myMethod 的覆盖。我也没有得到任何输出——大概是因为我不小心丢弃了被覆盖的myMethod。
代码
#include <iostream>
using namespace std;
class SuperClass {
public :
SuperClass() {
cout << "I'm the superclass" << endl;
};
virtual std::string myMethod();
};
class SubClassA : public SuperClass {
public:
SubClassA() : SuperClass() {
cout << "I'm subclass A" << endl;
}
std::string myMethod() override {
return "A";
}
};
class SubClassB : public SuperClass {
public:
SubClassB() : SuperClass() {
cout << "I'm subclass B" << endl;
}
std::string myMethod() override {
return "B";
}
};
class Client {
private:
std::string which;
SuperClass letterFactory(){
if (which == "A") {
SubClassA subClassA;
return subClassA;
} else if (which == "B") {
SubClassB subClassB;
return subClassB;
} else {
throw std::invalid_argument("Bad");
}
}
public:
explicit Client(std::string &which) : which(which) {
letterFactory();
};
};
int main() {
Client client();
return 0;
};
【问题讨论】:
-
您的
Client构造函数实际上是在创建然后丢弃一个SuperClass实例,这实际上是由于您按值返回而遭受切片。 -
您希望调用
letterFactory完成什么? -
请考虑以更清晰的方式形成问题。
-
@AndyG 这是我将我的扑克手牌评估器抽象为 MWE 的尝试。实际上,
letterFactory将调用从Hand派生的每个手牌类型类,并返回可以做出的最佳手牌(即对两对等)。 -
@shargors 我个人认为这个问题很清晰,但如果您认为可以改进,总是愿意接受提示?
标签: c++ oop polymorphism