让成员函数返回类型成为要返回的实际对象的超类的正确方法是什么?

威尔士语

问题

让成员函数返回类型成为您要返回的实际对象的超类的正确方法是什么?

问题

Clang tidy 警告我返回subClassAsubClassB丢弃我对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;
};
核桃

您没有返回您在 中创建的派生类对象letterFactory相反,您将基类对象作为您在函数中声明的派生类对象的切片副本返回。

调用myMethod此返回的对象将调用 中的实现SuperClass,因为其最派生的类型将是SuperClass

多态只适用于指针和引用。如果您希望您的类返回任一派生类类型,则它不能按值返回。您可以返回一个指向动态分配实例的指针:

std::unique_ptr<SuperClass> letterFactory(){
    if (which == "A") {
        return std::make_unique<SubClassA>();
    } else if (which == "B") {
        return std::make_unique<SubClassB>();
    } else {
        throw std::invalid_argument("Bad");
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

要构建的正确返回类型是什么?

范围内过滤方法的实际返回类型是什么?如何使其成为向量?

从函数返回的正确方法是什么?

InfoChyb 类的方法返回类型是什么

在成员函数中返回类对象是什么意思?

这个函数实际返回的是什么?

选择模板成员函数的正确返回类型

返回自身的函数的返回类型是什么?

我可以让超类返回对“实际类型”的引用吗?

从对象返回嵌套集合的正确方法是什么?

返回模板 lambda 函数的正确方法是什么?

Python类型注释:注释返回库对象的函数的正确方法

如果要通过引用返回成员,定义它的最佳方法是什么?

用返回类型与其第一个参数相同的函数来定义函数的正确方法是什么

返回由闭包借用自我产生的迭代器的函数的正确返回类型是什么

从成员函数指针获取方法的返回类型

Typescript - 使函数返回类型成为接口实现的类

函数对象的正确参数类型是什么?

扩展到BigDecimal的类从超类类型返回对象

super()返回的超级对象的类型是什么?

函数的返回类型中{}的目的是什么?

如何将类成员函数的返回类型设置为私有结构的对象

为什么不能自动成为函数的返回类型?

std :: setw,std :: setfill等的实际返回类型是什么?

如何定义返回嵌套类对象的模板类的成员函数

在常见的Lisp中,什么是返回两个对象的最特定超类型的函数?

将类型分配给类的打字稿成员的正确方法是什么

Swift:从超类返回子类类型的对象数组

返回 AsyncFunction 的 Typescript 函数的适当返回类型是什么?