具有不同参数的多态性
Polymorphism with different parameters
是否有
可能用不同的参数使用相同的函数名称进行多态性?
例如,我希望这三个函数合二为一。
virtual bool isValid1(const std::string&) = 0;
virtual bool isValid2(const uint32_t&) = 0;
virtual bool isValid3(const int& num) = 0;
换句话说,我有一个基础A
和三个派生 A 类。我也有 Base B
,它包含 Base A 类和 T(模板类型,可以是 string
、unit32
或 int
(参数的向量。当我想使用 vector
和参数从 Base B
isValid
函数调用时(像这样:isValid(argument)
(,我有点卡住了,因为我之前必须知道是调用isValid1(string)
、isValid2(uint32)
还是isValid3(int)
。
对于那些问的人的一些代码,
template <class T>
class Field
{
public:
void addValidator(BaseValidator* validator) { m_validator.push_back(validator); }
void validate() const { m_validator[0].isValid(m_data);}
private:
std::vector<BaseValidator*> m_validator;
T m_data;
};
- 我选择多态性,但其他类型的解决方案是受欢迎的。
- 如果问题太短而无法理解,请告诉我,以便我可以用不同的方法重写。
您可以重载成员函数。即使它们是纯虚拟的并且意味着被覆盖1:
virtual bool isValid(const std::string&) = 0;
virtual bool isValid(const uint32_t&) = 0;
virtual bool isValid(const int& num) = 0;
现在isValid(argument)
将执行过载解析并选择要调用的过载(通过动态调度(。唯一的潜在问题是,最后两个重载对于某些参数可能同样好,因此重载可能是模棱两可的。但这实际上取决于它被调用T
。
1 - 毕竟,这正是探视的意义所在。
您确实可以在 BaseA
类中使用相同的成员函数名称。这是重载的一部分,它是完全有效的,因为在名称查找之后,ADL 将帮助确定您打算调用哪个函数。
确切地说,您创建的每个函数的损坏名称取决于函数名称和函数参数。
struct BaseA
{
virtual bool isValid(const std::string&) = 0;
virtual bool isValid(const uint32_t&) = 0;
virtual bool isValid(const int &num) = 0;
};
BaseB::validate() const
功能有点粗略。您可能希望传递 std::size_t 参数以访问向量中的正确元素。
virtual bool validate(std::size_t elem) const
{
return vec[elem]->isValid(var);
}
下面是最终输出的代码示例:https://rextester.com/IHP38905
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- 在多态性中重新定义功能(虚拟),具有不同数量的参数
- 具有不同参数的多态性
- 为什么说C++不支持参数多态性
- 具有非类型模板参数的多态性
- C++ 多态性和可变参数模板
- C++,多态性与函数参数的模板化
- 成员变量多态性和参数引用
- c++对象参数:多态性,值语义,对象生命周期
- gtest类型参数化的多态性
- 具有可变函数参数的C++多态性