可能的重复:
为什么我可以通过指向派生对象的基类指针访问派生私有成员函数? https://stackoverflow.com/questions/3610936/why-can-i-access-a-derived-private-member-function-via-a-base-class-pointer-to-a
#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();
}
为什么p->fn2()
即使调用派生类函数fn2
是私有的D
?
访问修饰符,例如public
, private
and protected
仅在编译期间强制执行。当您通过指向基类的指针调用该函数时,编译器不知道该指针指向派生类的实例。根据编译器可以从这个表达式推断出的规则,这个调用是有效的。
降低派生类中成员的可见性通常是语义错误。现代编程语言(例如 Java 和 C#)拒绝编译此类代码,因为在基类中可见的成员始终可以通过基指针在派生类中访问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)