【问题标题】:Polymorphism with different parameters不同参数的多态性
【发布时间】:2019-03-25 13:28:42
【问题描述】:

有没有可能用不同参数的同名函数进行多态性?

例如,我希望这三个功能合而为一。

virtual bool isValid1(const std::string&) = 0;
virtual bool isValid2(const uint32_t&) = 0;
virtual bool isValid3(const int& num) = 0;

换句话说,我有一个 Base A 和三个 Derived A 类。我还有 Base B,它包含一个 Base A 类的向量和一个 T(模板类型,可以是 stringunit32int)参数。当我想使用 vector 和参数从 Base B 调用 isValid 函数时(像这样:isValid(argument))我有点卡住了,因为我必须先知道是否调用 isValid1(string),@ 987654332@或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;
};
  • 我选择了多态性,但也欢迎使用其他类型的解决方案。
  • 如果问题太短而无法理解,请告诉我,以便我用不同的方法重写。

【问题讨论】:

  • 你能告诉我们继承结构而不是描述它吗?
  • 很高兴看到更多代码或伪代码来进一步解释您的问题。
  • 您的Field::bool validate() 错误。您要为向量中的哪个元素返回isValid()???
  • 怀疑这就是你想要的。现在每次你调用validate(),你只是为第一个对象调用isValid()。只需将 std::size_t elem 传递给函数即可。

标签: c++


【解决方案1】:

您可以overload 成员函数。即使它们是纯虚拟的并且意味着被覆盖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 - 毕竟,这正是visitation 的意义所在。

【讨论】:

    【解决方案2】:

    您确实可以在BaseA 类中使用相同的成员函数名称。这是重载的一部分,它完全有效,因为在name lookup 之后,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

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      相关资源
      最近更新 更多