如何创建从同一类继承的不同对象的向量?

Posted

技术标签:

【中文标题】如何创建从同一类继承的不同对象的向量?【英文标题】:How do I create a vector of different objects that inherit from the same class? 【发布时间】:2020-02-21 17:19:37 【问题描述】:

我有不同的对象,例如三角形、平面、球体等,它们都继承自 OBJECTS 类。我想创建这些不同对象的向量,然后遍历每个元素并对它们执行操作。我正在尝试制作光线追踪器,我想创建将许多不同的对象放到场景中,但我不知道如何。 OBJECTS 是一个抽象类,所以我不能创建向量,因为我可以创建它的实例。我应该创建一个全新的类并让所有形状类都继承自它吗?或者我应该重新制作对象类,使其不再是抽象的?帮助表示赞赏。我的下一个最佳猜测是对象指针。

【问题讨论】:

std::vector<std::unique_ptr<OBJECT>> objects;? 【参考方案1】:

正如评论所建议的,你可以做这样的事情。

class Object
public:
    virtual ~Object()= default;
    virtual void foo() = 0;
;

class Pane: public Object
public:
    ~Pane() = default;
    void foo() override
        std::cout << "Hello Pane" << std::endl;
    
;

class Triangle: public Object
public:
    ~Triangle() = default;
    void foo() override
        std::cout << "Hello Triangle" << std::endl;
    
;

int main()

    std::vector<std::unique_ptr<Object>> objects;
    objects.emplace_back(std::make_unique<Triangle>());
    objects.emplace_back(std::make_unique<Pane>());

    for(auto &object: objects)
        object->foo();
    

    return 0;

只需创建一个 Objects-Pointers 向量。请注意,您不必使用unique_pointers,但我强烈建议您这样做,因为您不需要在最后删除对象。

这个简单程序的输出是:

Hello Triangle
Hello Pane

【讨论】:

愚蠢的问题,但向量不会自动释放内存,或者这不适用于指针并导致指针悬空,因为指针指向内存位置? 如果您使用的是原始指针,您必须在该向量内的所有对象上调用 delete。所以没有内存不会自动释放。 又一个愚蠢的问题,析构函数不是自动调用的吗? 哦,好吧,这很有意义,谢谢。并澄清一下,所以智能指针会在超出范围时删除对象及其本身,对吗?谢谢顺便说一句。 std::move(std::unique_ptr&lt;Object&gt;(new Triangle)):没用的std::move。也更喜欢std::make_unique&lt;Triangle&gt;() 而不是new

以上是关于如何创建从同一类继承的不同对象的向量?的主要内容,如果未能解决你的问题,请参考以下文章

基础对象和继承对象的向量

创建同一类的对象:Javascript原型、私有成员、继承

java 内部类的初学习

将继承的类对象的向量传递给期望基类向量的函数

类设计:类成员继承自同一个基类

面向对象—继承