虚函数是否覆盖基类中同名的非虚函数?

Dav*_*vid 6 c++

以下标准是否符合要求?你能举这个部分吗?

struct A
{
    virtual void func() = 0;
};

struct B
{
    void func(){}
};

struct C : public A, public B
{
    virtual void func(){ B::func(); }
};
Run Code Online (Sandbox Code Playgroud)

我在VS2010中得到了一个奇怪的编译器警告,它在同等但更复杂的代码中指向func派生最多类中的声明:warning C4505: unreferenced local function has been removed.我不知道为什么编译器认为在类中声明的虚函数是本地的; 但是我不能在一个更简单的例子中重复这个警告.

编辑:

我想出了一个小警告的重复案例.假设它与函数隐藏有关,我认为我走错了路.这是repro案例:

template<typename T>
struct C
{
    int GetType() const;
    virtual int func() const;   // {return 4;}  //  Doing this inline removes the warning <--------------
};

template<typename T>
int C<T>::GetType() const
{
    return 0;
}

template<>
int C<int>::GetType() const
{
    return 12;
}

template<typename T> 
int C<T>::func() const
{
    return 3; 
}

//  Adding the following removes the warning <--------------------
//  template<>
//  int C<int>::func() const
//  {
//      return 4;
//  }
Run Code Online (Sandbox Code Playgroud)

我很确定这只是一个VS2010错误.

Jam*_*lis 3

代码格式良好。 C::func覆盖A::func. B::func是一个不相关的函数。规范如下(10.3/2):

如果在类和直接或间接派生自 的类中vf声明虚拟成员函数,则具有与被声明,那么也是 virtual (无论是否如此声明)并且它覆盖 111 。BaseDerivedBasevfBase::vfDerived::vfBase::vf

C::func与 具有相同的名称并且A::funcA::func虚拟的,因此C::func覆盖A::func. B::func与 没有关系A::func;我不知道规范中是否有任何语言明确解决了这种情况。

Visual C++ 11 Beta 编译器不会对此代码发出任何警告或错误。