【发布时间】:2019-12-20 11:33:49
【问题描述】:
我正在实现一个执行特定领域任务的通用工作引擎类。所有字段都应从基类派生,因此将使用多态行为。我创建了具有特定于派生字段的类型的重载函数,即以下代码中的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 语句更简洁。另一方面,也许我犯了一些原始错误,所以我想把我的问题分成两个项目:
- 实现我的意图的正确方法是什么?
- 我遇到的错误的根源是什么?
提前感谢您的所有 cmets,
包含类定义的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 表达式中的具体类,指的是 // 魔术线。
【问题讨论】:
-
这能回答你的问题吗? Vectors and polymorphism in C++
-
实际上并非如此,我的问题更多是关于在 lambda 表达式中隐式转换为具体类。 // 魔法线
-
这是你的问题。在 C++ 中,这是具体类型的实例列表,而不是多态类型的引用列表。后半部分是您需要访问者模式,可以手动、通过变体或自己编写一些机器。
标签: c++ c++11 inheritance polymorphism overloading