Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:多态性_C++_Inheritance_C++11_Polymorphism - Fatal编程技术网

C++ C++;:多态性

C++ C++;:多态性,c++,inheritance,c++11,polymorphism,C++,Inheritance,C++11,Polymorphism,我想先展示一些代码,然后解释我的问题 基类: 子基类[可选,抽象]: 派生类: 现在我有了这个类,w/c有一个类型为std::vector的成员对象 错误: “swcObject”是“swcComboBox”的不可访问的基 愿望: 我不想像这样访问公共作用域上的swcComboBox::swcObject成员cbox.x=0,但改为cbox.setPosition(0,0)因为每当swcComboBox更改其位置时,总会对某些成员元素进行调整 相关代码: 错误: 在这种情况下,label的基

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

基类: 子基类[可选,抽象]: 派生类:

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

错误: “swcObject”是“swcComboBox”的不可访问的基

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


相关代码: 错误: 在这种情况下,
label
的基类为
swcText
swcObject
。将
标签
添加到
窗口的一个成员后。对象
(类型为std::vector),
swcText
属性将消失,就像
文本
属性一样

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

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

}

请推荐使用相同功能实现此类实现的其他方法。

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


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

@BasileStrynkevitch这是一个输入错误:)谢谢。但我只想真正按值复制它们。我的意思是,我喜欢先创建它们的原型,然后复制它,然后就消失了?我强烈建议大家看看肖恩·帕雷特的《继承是邪恶的基类》
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;
};
class swcWindow :
    private swcObject
{
public:
    void addObject(const swcObject &object);
private:
    std::vector<swcObject> objects;
};
swcWindow window;
swcComboBox cbox;

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

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

}