【问题标题】:Pure virtual function that should accept varying input arguments - how should this be implemented?应该接受不同输入参数的纯虚函数 - 这应该如何实现?
【发布时间】:2019-12-30 05:08:18
【问题描述】:

假设我有一个名为“组件”的基类

class Component
{

public:
    virtual void init() = 0;

};

这个基类需要派生类来定义一个“init”函数。但是,此 init 函数声明强制该函数不接受输入参数。这不是我想要的。

我正在寻找一种方法来强制执行“init”函数,但允许派生类在它接受的参数数量上有所不同。

根据组件类型,派生类应接受不同数量的输入。

如何在 C++ 中实现这一点?

例子

class DerivedComponent1 : Component
{
    void init(int arg1);
};

class DerivedComponent2 : Component
{
    void init(int arg1, int arg2);
};

【问题讨论】:

  • 这是三个不同的功能。无论如何,如果你有一个指向Component 的指针/引用,init 的调用者如何知道要传递多少个参数?
  • 对不起,这不能在 C++ 中完成。 C++ 不能以这种方式工作。子类只能覆盖具有完全相同签名的虚拟方法。这是根本。
  • 您想使用可变参数函数。它应该适用于纯虚拟。
  • 你想如何调用那些初始化函数?这可能会为我们提供如何实现这一目标的线索。

标签: c++ polymorphism virtual


【解决方案1】:

您应该考虑使用switch 语句而不是virtual 限定符来解决此问题。只需选择一个函数定义并选择默认值或零即可绕过对参数的考虑。当您尝试以这种方式对类所做的事情进行编码时,很容易感到困惑,因此您的函数必须经过完整的注释和单元测试。

[为澄清而编辑:您可以在每个新的派生实例中考虑 virtual 限定符,但这不是您所询问问题的解决方案。 ConstructorDestructor 方法必须具有非常具体的效果;否则,对一个类的效果进行质量测试是不切实际的,所以当你需要依赖one-size-fits-all constructor时,你真的只有在编码过程中非常小心才能达到那种效果]

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2015-12-24
    • 1970-01-01
    • 2014-07-25
    • 2011-09-04
    • 2021-06-01
    相关资源
    最近更新 更多