【发布时间】:2014-05-19 20:02:13
【问题描述】:
这是我prior question 的延续。请注意,下面的代码在p->f(1.0) 打印Derived::f(double) 进行虚拟调用。
#include <iostream>
#include <complex>
using namespace::std;
class Base
{
public:
virtual void f(double);
virtual ~Base() {};
};
void Base::f(double) { cout << "Base::f(double)\n"; }
class Derived : public Base {
public:
void f(std::complex<double>);
void f(double);
};
void Derived::f(std::complex<double>) { cout << "Derived::f(complex)\n"; }
void Derived::f(double) { cout << "Derived::f(double)\n"; }
int main()
{
Derived* p = new Derived;
p->f(1.0);
delete p;
}
如果我只是消除Derived 中的成员函数void f(double);,代码会静态调用Derived::f(std::complex<double>)。
是什么使编译器从第一个示例中的动态调用更改为第二个示例中的静态调用?我会很感激标准中的一些引用。
编辑:
正如我在上面所问的,对被认为是重复的问题的答案没有引用标准。谢谢。
【问题讨论】:
-
您预计会发生其他事情吗?
-
为什么每个人总是为这些例子写
new和delete?!没必要…… -
@KerrekSB 也许这可以解释:stackoverflow.com/a/334752/5987
-
我对您原始问题的回答也回答了这个问题。 :) 编辑:但没有引用标准。
-
要求参考标准并不会使您的问题与众不同。如果您真的想要该参考资料,请在其他问题中添加一个赏金,说明它是赏金的原因,或者只是评论一个答案并要求它。
标签: c++ c++11 overloading overriding