• 【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,此时为覆盖,返回类型应该相同,除非返回类型是所在类类型.

  • 相关阅读:
    源码阅读-logback的StaticLoggerBinder如何提供ILoggerFactory的实现类
    源码阅读-logback解析之对接日志门面slf4j
    不可变对象 -final-unmodifiableX
    安全发布对象
    线程安全性-原子性-可见性-有序性
    并发相关基础知识
    并发与高并发介绍
    Spring源码解析-ioc容器的设计
    微服务架构概述
    获取当前时间到毫秒
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3854914.html
Copyright © 2020-2023  润新知