一位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)
void test(int)!= void test(int) const并且会"破坏"虚拟通话.
和void test(int&)!= void test(const int&)并将"打破"虚拟通话.
void test(int)是一个声明,void test(const int)并且不会"破坏"虚拟呼叫.