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

  • 相关阅读:
    UML/ROSE学习笔记系列二:UML的概念模型
    UML/ROSE学习笔记系列五:用况对过程的描述
    UML/ROSE学习笔记系列四:图
    SQLSERVER2005 的作业调度(非原创)
    ORACLE 和SQLSERVER 两表之间批量更新数据对比
    彻底领悟javascript中的exec与match方法(非原创)
    对象,对象集合的简单Xml序列化与反序列化(非原创)
    JIT是库存管理的发展趋势
    UML/ROSE学习笔记系列一:建模原理、概念
    C# 多线程与异步操作实现的探讨(非原创)
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3854914.html
Copyright © 2011-2022 走看看