gpt4 book ai didi

c++ - 是否建议使用动态转换为派生类虚函数提供输入?

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:31 25 4
gpt4 key购买 nike

我阅读了 What is the proper use case for dynamic_cast 中的一些答案.

这里最符合我的情况的行是

#include<iostream>

class Shape
{
public:
virtual void draw()=0;
virtual ~Shape(){};
};

class Rectangle : public Shape
{
public:
int length;
int breath;

void draw()
{
std::cout<<"RECTANGE"<<std::endl;
}

};


class Circle : public Shape
{
public:
int diameter;

void draw()
{
std::cout<<"CIRCLE"<<std::endl;
}

};


/*Abstract Factory*/

Shape* getShapeObj(int type)
{
switch(type)
{
case 1:
return new Rectangle;

case 2:
return new Circle;

/* many types will be added here in future. */
}

return NULL;
};

void drawShapes(Shape *p_shape[],int len)
{
for(int i=0;i<len;i++)
p_shape[i]->draw();
}

int main()
{
Shape *l_shape[2];
l_shape[0]=getShapeObj(1);
l_shape[1]=getShapeObj(2);
Rectangle *l_rec=dynamic_cast<Rectangle*>(l_shape[0]);

if(l_rec)
{
l_rec->length=10;
l_rec->breath=20;
}

Circle *l_circle=dynamic_cast<Circle*>(l_shape[1]);

if(l_circle)
l_circle->diameter=25;

drawShapes(l_shape,2);

}

Essentially, virtual functions only work in some cases, not all of them.

我的问题是传递虚函数的输入,输入因类型而异。这里是否推荐使用动态转换?

最佳答案

解决方案是函数参数的完美转发,c++11引入。

template<typename ...CtorArgs>
Shape* getShapeObj(int type, CtorArgs&& ctor_args...)
{
switch(type)
{
case 1:
return new Rectangle(std::forward<CtorArgs>(ctor_args)...);
// many types will be added here in future.
}

return NULL;
}

显然使函数成为模板,违背了隐藏层次结构的目的(以及对构造函数的参数数量提出相当严格的要求)。但是,如果基类包含执行构造的函数映射,每个派生类使用指向构造它的函数的指针更新它,您仍然可以隐藏信息。


我最近写了一个answer关于在映射中存储类型删除函数指针,并将一些静态类型检查转发给运行时。

关于c++ - 是否建议使用动态转换为派生类虚函数提供输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41220278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com