C++ C++;:多态性
我想先展示一些代码,然后解释我的问题 基类: 子基类[可选,抽象]: 派生类: 现在我有了这个类,w/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的基
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?
...
}
}