我在创建容器类时遇到一些问题。

这是我想要的行为:

class AbstractBase
{
    public:
        AbstractBase() { }
        virtual std::string toString()=0;
};


class Derived : public AbstractBase
{
    public:
        Derived() { }
        std::string toString() { return "Just an example " + std::to_string( _value ); }
    private:
        int _value;
};

void Container::print()
{
    for( auto i : bunch_of_different_derived_objects_that_i_own )
        std::cout << i.toString() << std::endl;
}

通过仅保留指向AbstractBase类的指针来创建“拥有”许多不同派生对象的容器类的最佳方法是什么?

是否有可能使容器类拥有不同的派生对象而不知道它们的定义?

使用
std::vector<std::shared_ptr<AbstractBase>>

引起奇怪的行为
std::vector<std::unique_ptr<AbstractBase>>

不可能迭代。

是否可以实现我想要的?

最佳答案

1.声明虚拟析构函数

class AbstractBase
{
public:
    AbstractBase() { }
    virtual ~AbstractBase() = default; // this is (defaulted) virtual destructor
    virtual std::string toString() = 0;
};

class Derived : public AbstractBase
{
public:
    Derived() { }
    virtual std::string toString() override { return "Just an example " + std::to_string( _value ); }
private:
    int _value;
};

2.将shared_ptr存储在 vector
std::vector<std::shared_ptr<AbstractBase>> v = { std::make_shared<Derived>() };

3.做自己的事情,不再关心析构函数。
for (auto i : v)
{
    std::cout << i->toString() << std::endl;
}

关于c++ - 具有指向抽象基类的智能指针 vector 的容器类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25455583/

10-14 09:27