我可以将子类实例存储在超类实例中吗?

Can I store subclass instances inside a superclass instance?

我想用我的 classes 创建一个树结构,这样我就可以递归地更新一个对象,然后更新它的子对象。

我的第一个想法是在superclass中加入一个variant list,这样每一个后续派生的class也可以存储一个children的list(从而形成树结构)。我尝试实现类似于以下代码的内容,但在尝试将 Subclass A 和 B 添加到变体时不断出现错误。

是否可以在超级class中存储子classes?这是正确的方法吗?

如果有修复代码的方法或其他获得功能的方法,请告诉我!

#include <iostream>
#include <list>
#include <variant>

class SubClassA;
class SubClassB;

//-------------------------------------

class SuperClass {
public:
    std::list<std::variant<SuperClass, SubClassA, SubClassB>> children;
    
    void update() {
        // do X
        updateChildren();
    }

protected:
    void updateChildren() {
        for (auto &varObj : children) {
            std::visit([](auto& child) {child.update(); }, varObject);
        }
    }
};
    
//-------------------------------------

class SubClassA : public SuperClass {
public:
    void update() {
        // do Y
        updateChildren();
    }
};
    
//-------------------------------------

class SubClassB : public SuperClass {
public:
    void update() {
        // do Z
        updateChildren();
    }
};

问题是 updateChildren() 的定义出现得太早,在定义子类之前。因此,在需要完整类型的上下文中使用不完整类型。

一个可能的解决方案是将 SuperClass::updateChildren() 的定义放在最后:

class SuperClass {
    // ...
    void updateChildren();  // declaration only
};
    
class SubClassA : public SuperClass {/* ... */};
class SubClassB : public SuperClass {/* ... */};

void SuperClass::updateChildren() {
    // ...
}