【发布时间】:2018-04-18 18:32:24
【问题描述】:
一位 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;
}
输出:
base
derived
derived testx = 10
dest derived
dest base
【问题讨论】:
-
您的大师很可能在谈论
foo(int&)与foo(const int&)之类的东西。 -
请注意,一般来说,演示行为的代码并不能证明该行为。例如,我可以在我的平台上构建一个示例,该示例使用对
int的悬空引用,这似乎可以工作。但这并不能证明它通常有效,只能证明我对我未定义的行为感到(不)幸运。由于存在未定义的行为,显示某物以某种方式表现并不能证明它总是会以这种方式表现。最好转而依赖可靠的文档,最好是标准本身。 -
它不会“破坏”任何东西;只是覆盖函数必须具有与其覆盖的函数相同的参数列表。正如派生类中的
void f(int)不会覆盖基类中的virtual void f(double),void f(int&)也不会覆盖virtual void(const int&)。
标签: c++ inheritance