具有不同参数的多态性

Polymorphism with different parameters

本文关键字:多态性 参数      更新时间:2023-10-16
是否有

可能用不同的参数使用相同的函数名称进行多态性?

例如,我希望这三个函数合二为一。

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(模板类型,可以是 stringunit32int(参数的向量。当我想使用 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