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

Cia*_*lsh 0 c++ oop polymorphism

问题

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

问题

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;
};
Run Code Online (Sandbox Code Playgroud)

wal*_*nut 5

您没有返回您在 中创建的派生类对象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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 相关链接:[什么是对象切片?](/sf/ask/19223851/)。 (4认同)