从基类指针访问派生的私有成员函数到派生对象

bal*_*bas 8 c++ polymorphism inheritance access-modifiers

可能重复:
为什么我可以通过指向派生对象的基类指针访问派生的私有成员函数?

#include <iostream>
using namespace std;

class B {
public:
  virtual void fn1(void) {cout << "class B : fn  one \n"; }
  virtual void fn2(void) {cout << "class B : fn  two \n"; }
};

class D: public B {
    void fn1(void) {cout << "class D : fn one \n"; }
private:
    void fn2(void) {cout << "class D : fn two \n"; }
};

int main(void)
{
    B *p = new D;

    p->fn1();
    p->fn2();
}
Run Code Online (Sandbox Code Playgroud)

为什么p->fn2()调用派生类函数即使fn2是私有的D

Hos*_*Aly 5

访问修饰符,例如public,privateprotected编译过程中才会生效.通过指向基类的指针调用函数时,编译器不知道指针指向派生类的实例.根据编译器可以从该表达式推断出的规则,此调用有效.

降低派生类中成员的可见性通常是语义错误.现代编程语言(如Java和C#)拒绝编译此类代码,因为在基类中可见的成员始终可以通过基指针在派生类中访问.