创建派生类的 std::vector

Car*_*oli 0 c++ derived-class stdvector

假设我有一个抽象类

class AbstractClass {
public:
    virtual int get() const = 0;
};
Run Code Online (Sandbox Code Playgroud)

和两个不同的派生类

class DerivedClassA : public AbstractClass {
public:
    int get() const override { return 1; }
};

class DerivedClassB : public AbstractClass {
public:    
    int get() const override { return 2; }
};
Run Code Online (Sandbox Code Playgroud)

我想将std::vectorAbstract Classed 传递给给定的函数:

int f(const std::vector<std::shared_ptr<AbstractClass> >& classes) { ... }
Run Code Online (Sandbox Code Playgroud)

我正在做的是这样的:

int main () {
    std::vector<std::shared_ptr<AbstractClass> > _classes;
    std::shared_ptr<AbstractClass> _derivedA = std::make_shared<DerivedClassA>();
    _classes.push_back(_derivedA);
    std::shared_ptr<AbstractClass> _derivedB = std::make_shared<DerivedClassB>();
    _classes.push_back(_derivedB);
    std::cout << f(_classes) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

它确实有效,但我想知道是否有更紧凑的形式可以用现代 C++ 编写它?我尝试auto在某些地方使用,但它总是给出错误,或者就地构建派生类,但效果不佳。

eer*_*ika 6

它确实有效,但我想知道是否有更紧凑的形式来编写它

您可以去掉中间变量以使其更加紧凑:

f({
    std::make_shared<DerivedClassA>(), 
    std::make_shared<DerivedClassB>(),
});
Run Code Online (Sandbox Code Playgroud)

由于所有访问说明符都是公共的,因此您可以使用以下方法使类定义更加紧凑struct

struct DerivedClassB : AbstractClass {
    int get() const override { return 1; }
};
Run Code Online (Sandbox Code Playgroud)