在"函数参数"中通过const类型在派生类中使用不同函数参数的虚函数会破坏虚函数吗?

bud*_*ddy 1 c++ inheritance

一位C++专家告诉我,在派生类中用const改变函数参数类型会破坏虚拟调用机制.

我尝试了一个简单的程序(原谅非标准代码,纯粹是为了测试而编写),否则就证明了这一点.函数参数按const值改变不会破坏虚拟机制,

是否有任何原因和文档指出这种行为?

VS 2012编译器和最新的g ++编译器注意到了行为.

#include <iostream>
using namespace std;


class Base
{
public:
Base(){ cout<<"base"<<endl;}
virtual ~Base(){ cout<<"dest base"<<endl;}
virtual void test(const int x){ cout << "base test"<<"x = " << x<<endl;}
};

class Derived : public Base
{
public:
Derived(){ cout<<"derived"<<endl;}
virtual ~Derived(){ cout<<"dest derived"<<endl;}
virtual void test(int x){ cout << "derived test"<<"x = " << x<<endl;}
};
int main() {

    Base *b = new Derived();
    b->test(10);
    delete b;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

base
derived
derived testx = 10
dest derived
dest base
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 5

void test(int)!= void test(int) const并且会"破坏"虚拟通话.
void test(int&)!= void test(const int&)并将"打破"虚拟通话.

void test(int)是一个声明,void test(const int)并且不会"破坏"虚拟呼叫.


lll*_*lll 5

顶级 cv 限定符不是函数签名的一部分,它们只是被忽略。

[dcl.fct]/5

生成参数类型列表后,在形成函数类型时删除任何修改参数类型的顶级 cv 限定符。