向虚拟方法添加默认参数

Adding default arguments to virtual methods

本文关键字:默认 参数 添加 方法 虚拟      更新时间:2023-10-16

在下面的代码中,我想在不修改子类的情况下将新的默认参数"z"添加到"func"方法中。我收到错误 C2259:"CTest":无法实例化抽象类错误。

无论如何可以在不修改所有子类的情况下执行此操作吗?

class ITest
{
public:
    virtual void func(int x, int y, char c, int z = 1) = 0;
};
class CTest : public ITest
{
public:
    void func(int x, int y, char c)
    {
    }
};

你想要的不是直接可能的。现有类不知道 z 参数,因此无法使用它。如果要提供一些新的子类,其客户端将知道z并能够使用它,则可以执行以下操作:

class ITest
{
public:
    virtual void func(int x, int y, char c) = 0;
    virtual void func(int x, int y, char c, int z)
    { func(x, y, c); }
};

这样,旧类的工作方式与以前一样,调用 3 参数版本的客户端也是如此。您还可以选择使用 z 的新子类和使用 4 参数版本的新客户端。

您必须修改子类中的func()方法,以使其与父类中的方法匹配。 无论哪种方式,您都会收到此错误:cannot instantiate abstract class error

您可以添加私有数据并将其初始化为 1

class ITest
{
public:
    ITest(): z(1) {} 
    virtual void func(int x, int y, char c) = 0;
private:
    int z;
};