zoukankan      html  css  js  c++  java
  • 【c++】面向对象程序设计之继承中的类作用域

    当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。

    一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的。即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的。基类指针(引用)即使指向派生类对象,仍然不能通过该指针(引用)来访问派生类中定义的成员,即使是public。编译器通过静态类型来确定调用对象在内存中所占空间大小

    原因:http://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3823950.html

    名字查找与继承:(函数调用步骤)

    假设调用p->mem()

    1.首先确定p的静态类型

    2.在p的静态类型对应的类中查找,如果找不到,则依次在直接基类中不断查找直至到达继承链的顶端,如果找遍了该类及其基类仍然找不到,编译器将报错

    3.一旦找到mem,就进行常规的类型检查,以确认对于当前找到的mem,本次调用是否合法

    4.假设调用合法,则编译器根据调用的是否是虚函数而产生不同的代码:

    如果mem是虚函数且我们是通过引用或指针进行的调用,则编译器产生的代码将在运行时确定到底运行该虚函数的哪个版本,依据是对象的动态类型;

    反之,则编译器将产生一个常规函数调用

    class A
    {
    public:
        void p()
        {
            cout << "a" << endl;
        }
    };
    
    class B :public A
    {
    public:
        void p()
        {
            cout << "b" << endl;
        }
    };
    
    void main()
    {
        A *a = new A; 
        A *b = new B;
        a->p();
        b->p();
        delete a;
        delete b;
    }

    输出a,a

    -------------------------------------------------------------------------------------------------------

    名字查找优于类型检查

    如果派生类的成员与基类的某个成员同名,则派生类在其作用域内隐藏该基类成员,即使派生类成员与基类成员的形参列表不一致,基类成员也仍然被隐藏。

    “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
    (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
    (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆),若有virtual,此时为覆盖,返回类型应该相同,除非返回类型是所在类类型.

  • 相关阅读:
    Job for docker.service failed because the control process exited with error code. See
    连接数据库出现The server time zone value '�й���׼ʱ��' is unrecogni等问题的解决方案
    【面试】SSH 框架原理
    【面试】Spring 执行流程
    【面试】Redis
    Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.
    分享一个带有合计行功能的DataGridView扩展
    记录一次系统优化
    使用 Cordova(PhoneGap)构建Android程序
    分享一个换肤解决方案
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3854914.html
Copyright © 2011-2022 走看看