目录
C++允许给子类的成员函数赋予多个限定条件(与Java不同)。
1.编译期间权限检测
下面程序可以正常编译。
#include<iostream>
class Base {
public:
virtual int fun(int i) { std::cout<<"Base: "<<i<<std::endl; }
};
class Derived: public Base {
private:
int fun(int x) { std::cout<<"Derived: "<<x<<std::endl; }
};
int main()
{
}
基于上述程序,修改main函数如下,则会编译失败,因为fun()是私有函数,Derived对象无权访问。
int main()
{
Derived d;
d.fun(1); //编译失败。无法访问私有函数
return 0;
}
编译结果(visual studio 2015):
error C2248: “Derived::fun”: 无法访问 private 成员(在“Derived”类中声明)
2.运行时的权限
下面程序如何?
#include<iostream>
class Base {
public:
virtual void fun(int i) { std::cout << "Base::fun(int)" << i << std::endl; }
};
class Derived : public Base {
private:
void fun(int x) { std::cout << "Derived::fun(int)" << x << std::endl; }
};
int main() {
Base* pb = new Derived;
pb->fun(123);
return 0;
}
输出:
Derived::fun(int)123
上述程序中,函数 “Derived::fun(int )”通过一个基类指针进行了调用。程序可以正常运行,这是因为fun()是基类的一个公有函数,Base类的对象可以访问。
访问权限是在编译期间检测的。而在运行时期间,只管去调用指针所指向对象的相关的函数,而不会去检查访问权限。
因此,通过一个基类指针,可以访问子类的private私有函数。