3

在下面的代码中,我想在不修改子类的情况下将新的默认参数“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)
    {
    }
};
4

3 回答 3

3

你想要的不是直接可能的。现有的类不知道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 参数版本的新子类和新客户端。

于 2013-11-06T08:45:02.663 回答
1

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

于 2013-11-06T08:44:13.637 回答
-1

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

class ITest
{
public:
    ITest(): z(1) {} 
    virtual void func(int x, int y, char c) = 0;
private:
    int z;
};
于 2013-11-06T08:46:33.543 回答