C++: Polymorphism

C++: Polymorphism

本文关键字:Polymorphism C++      更新时间:2023-10-16

我想先展示一些代码,稍后再解释我的问题。

基类:

class swcObject :
    public swcRectangle
{
public:
    bool visible;
};

子基类[可选抽象]:

class swcText
{
public:
    std::string text;
protected:
    virtual void attachedToParent() = 0;
};

派生类:

class swcLabel :
    public swcObject,
    public swcText
{
public:
    int text_align;
private:
    void attachedToParent();
};

class swcComboBox :
    virtual protected swcObject
{
public:
    void setPosition(int x, int y);
private:
     swcLabel label;
};

现在我有了这个类w/c,它有一个类型为std::vector<swcObject>的成员对象。

class swcWindow :
    private swcObject
{
public:
    void addObject(const swcObject &object);
private:
    std::vector<swcObject> objects;
};

我遇到了一些以前从未遇到过的问题,谷歌似乎也没有像我这样的相关问题。

我的具体问题是:


相关代码:

swcWindow window;
swcComboBox cbox;
window.addObject(cbox);

错误:

"wcObject"是"swcComboBox"的不可访问基

渴望:

我不想访问像cbox.x = 0;这样的公共作用域上的swcComboBox::swcObject成员,而是访问cbox.setPosition(0, 0);,因为每当swcComboBox更改其位置时,总会对一些成员元素进行调整。


相关代码:

swcWindow window;
swcLabel label;
window.addObject(label);

错误:

在这种情况下,label具有swcTextswcObject的基类。在将label添加到window.objects的一个成员(的类型为std::vector)之后,swcText属性将消失,就像text属性一样。

渴望:

我想创建一个临时对象,并在这些类之外的init()方法中初始化其属性,然后使用swcWindow::addObject()复制它。这可能没有石膏吗?我认为这个可以,但它很糟糕(?),如果它有效的话,我还没有尝试:

void addObject(const swcObject &object, SWC_TYPES type)
{
    switch (type)
    {
    case LABEL:
        //do casting?
    ...
    }
}

请推荐我如何使用相同功能实现此类实现的任何其他方式。

向量按值存储元素,就好像您将ComboBox传递给了一个按值而非引用获取swcObject的过程。这会导致将对象剪切到其基类,如果使用受保护的继承,则禁止这样做。

不应该将多态对象存储在向量中,就像不应该按值传递它们一样。您可以尝试将引用或(智能)指针存储在向量中,这样可以解决您的问题。