在下面的代码中,我想在不修改子类的情况下向'func'方法添加新的默认参数'z'。我得到错误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)
{
}
};
答案 0 :(得分: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参数版本的新客户端选择新的子类。
答案 1 :(得分:1)
您必须修改子类中的func()
方法,以使其与父类中的方法匹配。无论哪种方式,您都会收到此错误:cannot instantiate abstract class error
。
答案 2 :(得分:-1)
您可以添加私人数据并将其初始化为1
class ITest
{
public:
ITest(): z(1) {}
virtual void func(int x, int y, char c) = 0;
private:
int z;
};