如何解决C++多态函数图
我想用一个 C++ map
的函数来执行一些子程序。
因为,这样的函数映射需要所有映射函数具有相同类型的输入和输出,而我的函数可以具有不同的输入类型,我虽然可以使所有这些不同的类型从 SuperParentClass
派生。
然而,这个想法给我带来了一些麻烦。 它不编译。 实际上,编译器捕获派生类型而不是父类。 但是如果你直接在我的函数中使用父类,我将无法在我的函数中使用它们的特长(所以我来寻求帮助)。
这是我的 MWE:
#include <functional>
#include <iostream>
#include <map>
#include <string>
#include <math.h>
class SuperParentClass
{
private:
/* data */
public:
std::string nameClass;
};
class ChildClassRectangle : public SuperParentClass
{
private:
/* data */
public:
int longueur=2;
int largeur=2;
};
class ChildClassCircle : public SuperParentClass
{
private:
/* data */
public:
int radius=2;
};
int areaRect(ChildClassRectangle rect)
{
std::cout << "areaRect "<< rect.largeur*rect.longueur << std::endl;
return 0;
}
int areaCircle(ChildClassCircle circ)
{
std::cout << "areaCircle "<< 3.14*pow(circ.radius,2) << std::endl;
return 0;
}
int main()
{
std::cout << "TEST " << std::endl;
std::map<std::string,SuperParentClass> mapObject;
ChildClassCircle circ;
circ.radius=2;
mapObject["Circle"]=circ;
ChildClassRectangle rect;
rect.longueur=1;
rect.largeur=3;
mapObject["Rectangle"]=rect;
using CallFunc = std::function<int(SuperParentClass)>;
std::map<std::string,CallFunc> mapFunction;
// mapFunction["Circle"]=areaCircle;
// mapFunction["Rectangle"]=areaRect;
// mapFunction["Circle"](mapObject["Circle"]);
// mapObject["Rectangle"].largeur=4;
// mapFunction["Rectangle"](mapObject["Rectangle"]);
};
最后 5 行注释是我想做但不起作用的事情。
解决方法
它可以映射到 SuperParentClass 指针,而不是将映射转到函数。然后在每个类中使用一个虚函数来封装想要的行为。
int areaRect(ChildClassRectangle rect);
int areaCircle(ChildClassCircle circ);
class SuperParentClass
{
public:
virtual int area() = 0;
... // more code...
};
class ChildClassRectangle : public SuperParentClass
{
public:
virtual int area() override
{
return areaRect(*this);
}
... // more code...
};
class ChildClassCircle : public SuperParentClass
{
public:
virtual int area() override
{
return areaCircle(*this);
}
... // more code...
};
要消除类的值传递,只需将函数移动到 area() 函数中即可。
现在无需单独的映射即可直接调用函数。
这是一个粗略的版本,可能无法正常工作;但传达了想法。
void main()
{
std::map<std::string,SuperParentClass*> mapObject;
...
mapObject["Circle"]=ˆ
...
mapObject["Rectangle"]=▭
...
const int circleReturn = mapObject["Circle"]->area();
// Cannot access derived properties here
// mapObject["Rectangle"]->largeur=4; // No longer valid.
const int rectReturn = mapObject["Rectangle"]->area();
}
这里不需要指针;因为物体可以放置在容器上;或其他类型的数据结构。这只是为了表明使用虚函数是一种更简单的方法和更好的设计。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。