C++中部分类函数覆盖的问题

FP.*_*FP. 6 c++ inheritance

是否存在部分覆盖基类定义的一组虚函数的问题?

我的编译器提供以下警告:

overloaded virtual function "MyBaseClass::setValue" is only partially overridden in class "MyDerivedClass".
Run Code Online (Sandbox Code Playgroud)

这些类看起来像这样:

class MyBaseClass
{
public:
    virtual void setValue(int);
    virtual void setValue(SpecialType*);
}

class MyDerivedClass : public MyBaseClass
{
public:
    virtual void setValue(int);
}
Run Code Online (Sandbox Code Playgroud)

摆脱此警告的简单方法是为基本函数使用不同的名称,但我想知道是否有任何令人信服的理由来修复此特定警告.我不相信这违反了C++标准.我的猜测是警告程序员他们可能忘记为所有可能的输入类型实现行为.在我们的例子中,有意排除某些特定类型.

你会劝阻完全压制这个警告吗?

sth*_*sth 13

对基类setValue(int)隐藏的覆盖setValue(SpecialType*)(请参阅C++ FAQ Lite),因此如果您尝试调用setValue(new SpecialType()),则会出现错误.

您可以通过向using派生类添加一个指令来避免这种情况,该派生类从基类"导入"重载:

class MyDerivedClass : public MyBaseClass
{
public:
    using MyBaseClass::setValue;
    virtual void setValue(int);
};
Run Code Online (Sandbox Code Playgroud)


edu*_*ffy 6

警告是正确的,它被称为"名字隐藏".类型的变量MyDerivedClass无法调用setValue(SpecialType*).


现在我要公然撕掉其他人的博客:

在C++中重载和名称隐藏

在昨晚与布拉德的电话交谈中,他告诉我他在新的C++工作中遇到的一个奇怪的问题.当然,对于拥有丰富C++经验的人来说,这可能没什么大不了的,但对于我们这些生活在托管代码世界中的人来说,这似乎很奇怪.

在C++中,如果您有一个带有重载方法的类(成员函数,无论您想要调用它),然后扩展并覆盖该方法,则必须覆盖所有重载方法.

我理解您在子类中更改了方法签名的情况,从而使已建立的接口无效.但是,在这种情况下,它似乎违反直觉,因为您不是在更改界面,而是选择性地覆盖.哪个是不同的.

例如:

class FirstClass
{
public:
        virtual void MethodA (int);
        virtual void MethodA (int, int);
};

void FirstClass::MethodA (int i)
{
    std::cout << "ONE!!\n";
}

void FirstClass::MethodA (int i, int j)
{
     std::cout << "TWO!!\n";
}
Run Code Online (Sandbox Code Playgroud)

这里简单的类有两个方法(或一个重载方法).您想要覆盖双参数版本,因此继续以下操作:

class SecondClass : public FirstClass
{
public:
    void MethodA (int);
};

void SecondClass::MethodA (int i)
{
    std::cout << "THREE!!\n";
}
Run Code Online (Sandbox Code Playgroud)

现在,当您使用SecondClass的实例时,大多数Java或C#程序员可能会假设您可以调用:

int main ()
{
    SecondClass a;
    a.MethodA (1);
    a.MethodA (1, 1);
}
Run Code Online (Sandbox Code Playgroud)

但是,第二次调用将不起作用,因为双参数MethodA不可见.您可以获取指针并向上转换为FirstClass,但您的SecondClass实例不会直接继承未重写的方法.