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
具有swcText
和swcObject
的基类。在将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的过程。这会导致将对象剪切到其基类,如果使用受保护的继承,则禁止这样做。
不应该将多态对象存储在向量中,就像不应该按值传递它们一样。您可以尝试将引用或(智能)指针存储在向量中,这样可以解决您的问题。
相关文章:
- C++结合静态和动态多态性来创建"Hyper Polymorphism"?
- "Static polymorphism with Qt signal/slot: What is wrong?"
- visual c++ static polymorphism (CRTP) 在评估"静态 constexpr&
- C++:STL 类型和自定义类型的优雅"polymorphism"?
- Polymorphism , c++
- visual About MFC C++ Polymorphism
- C++: Polymorphism
- 如何使运算符过载并且不使用"Curiously Recurring Template Pattern"和"Run Time polymorphism"
- 为什么'pure polymorphism'比使用 RTTI 更可取?
- C++ polymorphism
- "True Polymorphism"的例子?(最好使用哈斯克尔)
- Polymorphism c++
- Inheritance-free polymorphism
- 使用派生类型为基类型的模板化参数调用函数时"template polymorphism"?