C++中,虚函数可以为private,并且可以被子类覆盖。
例如,下面程序工作正常。
#include<iostream>
class Base {
private:
virtual void fun() { std::cout << "Base Fun" << std::endl; }
friend int main();
};
class Derived : public Base {
public:
void fun() { std::cout << "Derived Fun" << std::endl; }
};
int main() {
Base* ptr = new Derived;
ptr->fun();
return 0;
}
运行结果:
Derived fun()
对于上面的程序,有下面几点是需要注意的方面:
1) ptr是一个Base类型的指针,指向的是Derived对象。最终实际调用的是Derived::fun()。
2) int main()是Base类的友元函数。如果删除这个友元声明,则程序会编译失败。因为在编译期间,会进行权限检查。对于这行代码ptr->fun(), 编译器会检查到fun是私有函数,base类型的对象/指针无权访问。
这种行为与Java完全不同。在Java中,私有方法默认是final的,不能被覆盖。