c++ - 使用具有多态行为的重载函数
问题描述
我正在实现一个执行特定领域任务的通用工作引擎类。所有字段都应从基类派生,因此将使用多态行为。我创建了具有特定于派生字段的类型的重载函数,即work_engine::run(const a_field& af)
在下面的代码中。我假设每当一个字段(基类类型)出现时,都会自动调用相应的函数。但是,我得到了下面的错误(指//魔术线):
Error C2664 'void work_engine::run(const b_field &)': cannot convert argument 1 from 'base_field' to 'const a_field &'
我曾经在 C# 中使用这种方法,但在 C++ 中我不熟悉它。通过使用 C++11 和更高版本的功能,我想实现相同的方法,因为它比使用带有强制转换操作的 if-else 语句更简洁。另一方面,也许我犯了原始错误,所以我想将我的问题分为两个项目:
- 实现我的意图的正确方法是什么?
- 我遇到的错误的根源是什么?
提前感谢您的所有评论,
Header1.h 包括类定义如下:
#pragma once
#include <algorithm>
#include <list>
// abstract class of all fields
class base_field
{
public:
base_field() {}
virtual ~base_field() {}
};
// custom a field
class a_field : public base_field
{
public:
a_field() : base_field(){}
};
// custom b field
class b_field : public base_field
{
public:
b_field() : base_field() {}
};
class work_engine
{
public:
std::list<base_field> fields;
private:
void run(const a_field& af) {}
void run(const b_field& bf){}
public:
void run_all()
{
for_each(fields.begin(), fields.end(), [&](auto& el) { this->run(el); }); // magic line
}
};
主要如下:
#include <iostream>
#include <Header1.h>
int main()
{
work_engine engine;
engine.fields.push_back(a_field());
engine.fields.push_back(b_field());
engine.run_all();
}
换句话说,我正在寻找的是隐式转换为 lambda 表达式中的具体类,指的是 // 魔术线。
解决方案
首先:你需要一个在这个问题std::list<base_field *>
中详述的。
其次,必须明确地进行向下转换,并且您不能在运行时自动选择适当的函数重载。
一种解决方案可能是在base_field
class base_field
{
public:
base_field() {}
virtual ~base_field() {}
virtual void Run() = 0;
};
// custom a field
class a_field : public base_field
{
public:
a_field() : base_field(){}
void Run(work_engine &engine) { engine.run(*this); }
};
在那里,您需要work_engine::run
公开或使其成为a_field
(或b_field
分别)的朋友。
另一种方法是在运行时使用类型检查。如果你有,base_field *base
你可以像这样检查类型:
auto aPtr = dynamic_cast<a_field *>(base);
if(aPtr != nullptr) {
this->run(*aPtr);
}
else {
auto bPtr = dynamic_cast<b_field *>(base);
if(bPtr != nullptr) {
this->run(*bPtr);
}
else {
// Ooops, it's something else entirely.
}
}
这只是一个基本的大纲,但我希望它有所帮助。
推荐阅读
- php - Symfony\Component\Debug\Exception\FatalThrowableError 类 '\App\Admin' 未找到
- javascript - 如何通过 JavaScript 使用引导选项卡来激活选项卡提交的表单
- php - PHP 检查一个数字是否在序列中但缺少一个
- c++ - 没有进程间通信(ipc)的继承句柄有什么意义?
- java - GetParts() 在 servlet 中返回 null
- swift - 如何将分段控制设计从方形更改为圆形
- arrays - Swift 中每隔一个奇数数组
- bash - Bash on macOS - 获取给定年份每个星期六的日期列表
- c# - 编码和解码奇怪的.shm文件数据到base64 c#
- java - ArCore 成功楼层查找