Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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++_Design Patterns_Polymorphism_Virtual_Composition - Fatal编程技术网

C++ 在c+中通过组合的多态性行为+;没有多级继承

C++ 在c+中通过组合的多态性行为+;没有多级继承,c++,design-patterns,polymorphism,virtual,composition,C++,Design Patterns,Polymorphism,Virtual,Composition,我希望通过组合实现多态行为,而不是多级继承。在下面的示例中,代码bluerectangle派生自rectangle,bluecircle派生自circle。所以问题是我可能在继承层次结构中有相同的深度,所以工作是使用组合而不是多级继承来降低层次结构级别。我们可以通过组合实现多态行为吗?如果是,那么这里需要遵循什么设计。目前,我刚刚开始阅读设计模式,所以它似乎类似于桥接模式,但如果没有合适的指针,就无法继续 #include<iostream> using namespace

我希望通过组合实现多态行为,而不是多级继承。在下面的示例中,代码bluerectangle派生自rectangle,bluecircle派生自circle。所以问题是我可能在继承层次结构中有相同的深度,所以工作是使用组合而不是多级继承来降低层次结构级别。我们可以通过组合实现多态行为吗?如果是,那么这里需要遵循什么设计。目前,我刚刚开始阅读设计模式,所以它似乎类似于桥接模式,但如果没有合适的指针,就无法继续

 #include<iostream>
    using namespace std;
    class shape
    {
    public:
    virtual void draw()=0;
    virtual ~shape(){}
    };

    class rectangle: public shape
    {
    public:
    void draw()
    {
    cout<<"draw rectangle"<<endl;
    }
    }; 
    class bluerectangle : public rectangle
    {
    public:
    void draw()
    {
    cout<<"draw bluerectangle"<<endl;
    }
    };
    class circle: public shape
    {
    public:
    void draw()
    {
    cout<<"draw circle"<<endl;
    }

    }; 

    class bluecircle : public circle
    {
    public:
    void draw()
    {
    cout<<"draw bluecircle"<<endl;
    }
    };

    int main()
    {
    shape *obj=new circle;
    obj->draw();
    obj=new rectangle;
    obj->draw();
    obj=new bluerectangle;
    obj->draw();
    obj=new bluecircle;
    obj->draw();
    delete obj;
    return 1;
    }
#包括
使用名称空间std;
阶级形态
{
公众:
虚空绘制()=0;
虚拟~shape(){}
};
类矩形:公共形状
{
公众:
作废提款()
{

cout根据您在评论中的回答,这是一个经典的装饰图案

要获得红色矩形,请将其包裹:

Shape *obj=new RedDecorator(new Rectangle);
obj->draw();

装饰器的
draw()
调用矩形的
draw()
并对其进行扩充(装饰).

我不确定您需求中的“蓝色”部分来自何处。如果您试图通过组合实现可变性,这听起来像是“装饰”模式,但它仍然需要一个级别if继承。如果您解释需求的“为什么”部分,这可能会有所帮助。它是表示多级继承的层次结构的一部分。只有E表示它在那里使用的类层次结构。继承层次结构在第一级继承之前似乎是完美的,直到圆形和矩形,但从这一点来看,如果使用下一级继承,层次结构似乎会额外增加开销,因此从这一点开始,作业开始通过应用组合来减少相同的开销。我仍然不明白好的。如果你给出一个具体的层次示例,我想它会有所帮助。形状->矩形->蓝色矩形或形状->矩形->红色矩形或任何其他形式的矩形需要在形状->矩形(颜色)中重构。这是一种is-a关系,但可以通过颜色->红色或颜色->蓝色轻松区分。这应该是RedDecorator而不是RedRectangle吗?@amdn。确实可以。修复它。感谢更新和更新内存泄漏问题。我将尝试实现此功能,并发现任何问题,然后返回给您。