我发现了这段用C ++编写的代码:
在以下情况下:
#include<iostream>
using namespace std;
class Base {
public:
virtual int fun(int i) { cout << "Base::fun(int i) called"; }
};
class Derived: public Base {
private:
int fun(int x) { cout << "Derived::fun(int x) called"; }
};
int main()
{
Base *ptr = new Derived;
ptr->fun(10);
return 0;
}
输出:
Derived::fun(int x) called
在以下情况下:
#include<iostream>
using namespace std;
class Base {
public:
virtual int fun(int i) { }
};
class Derived: public Base {
private:
int fun(int x) { }
};
int main()
{
Derived d;
d.fun(1);
return 0;
}
输出:
编译器错误。
有人能解释一下为什么会发生这种情况吗?在第一个案例中,通过对象调用了一个私有函数。
d.fun(1)
不是虚函数调用,但ptr->fun(10)
是。 - Zyx 2000->
或.
运算符无关,它只与您用于调用方法的类型有关:如果您通过Base
调用该方法,则编译为公共方法Base::fun
。如果您通过Derived
调用该方法,则会失败,因为Derived::fun
是私有的。现在,fun
是虚拟的,这意味着调用它默认情况下是动态绑定...除非编译器可以保证对象的确切类型在编译时已知。在这种情况下,调用将被优化,以静态方式解析正确的方法。 - paercebal