修改基类访问权限

  派生类的作用域嵌套在基类作用域中。

  C++中确定函数调用遵循如下四个步骤:

    确定进行函数调用的对象、引用或指针的静态类型

    在该静态类型的类中查找函数,如未找到,就在直接基类中查找,如此顺着类的继承链往上,直到找到该函数或者查找完最外层的作用域。如果无法找到该名字,则调用错误。

    一旦找到该名字,就进行常规类型检查(此时才涉及类型检查),查看该函数调用是否合法;

    如合法,编译器生成代码。如函数是虚函数,且通过引用或指针调用,则编译器生成代码以确定根据对象的动态类型运行哪个函数版本;否则,编译器生成代码直接调用函数。

 

  如果派生类成员与基类成员同名,根据作用域规则,派生类成员将屏蔽基类成员。可以利用这种屏蔽:

    在派生类扩展基类功能后,为了避免别人错误地调用基类功能,即调用基类函数,而非扩展后的派生类同名函数,可屏蔽基类函数。

class Base
{
public:
    void Func(){}
};

class Derive : public Base
{
private:
    void Func(){}   // 更改访问权限,public -> private
};

    这样Derive对象就无法直接调用Func()功能。

    从函数调用的四个步骤可知,虚函数的调用与普通函数只有最后一步的些微差别。所以这种屏蔽方式对虚函数同样有效果,只需注意:

    基类中的virtual函数在派生类中override:基类中virtual函数为public,派生类中的访问权限为private,正确。反之,如果基类中为private,而派生类为public,错误。在客户端代码使用基类指针指向一个派生类对象时,调用该函数,编译失败,因为指针调用函数的权限问题是静态的,在编译期检查时,只看指针的类型,真正运行时调用哪个函数才是看具体指针指向哪个对象

 

详细论述参见:

修改基类访问权限:http://blog.csdn.net/qiudaowen/article/details/6302786

当 virtual 函数的访问权限在派生类中被修改时:http://hi.baidu.com/unixfy/blog/item/4ced283c86bd873497ddd897.html

posted on 2012-04-16 13:22  海茉莉  阅读(461)  评论(0编辑  收藏  举报