zoukankan      html  css  js  c++  java
  • C++继承与组合

    C++继承与组合

    继承与组合

    继承和组合这两种方式得到的对象的内存结构是完全相同的,但是使用组合时要重写所包含类对象的部分成员函数
    例如:
    wpse890.tmp.jpeg
    当使用组合时,要获取成员对象时如果不重写成员函数,就需要用
    m_Cperson.GetSex()和m_Cperson.GetName来获取成员对象的信息

    继承方式和访问控制

    wpse891.tmp.jpeg
    注:

    • 上述表格中的"不可见"只是编译时检查是否有代码访问父类中的私有成员,无论以何种方式继承,父类中的
      私有数据成员和成员函数在子类中均是不可见的,继承方式是 用来重新指定父类的成员在子类中的访问权限。
    • 如果在继承时没有指明继承的方式,默认的是私有继承
    • 如果父类中有修改私有数据成员的非私有成员函数,那么在子类中调用调用父类的这些成员函数是可以改变
      父类的私有数据成员的。
    • 当创建子类对象时,是先创建继承的父类的对象,父类对象放在最前面,这样做一是为了兼容性考虑,
      如果以后子类要进行成员扩充,只需要在尾部添加即可,先前的程序不用做改动依旧可以正常访问,这样做
      也有简化了编译器计算父类对象的偏移。
    • 数据隐藏和函数重载的区别:
      数据隐藏:a.不同作用域 b.成员名称相同 c.参数列表相同
      函数重载:a.作用域相同 b.函数名称相同 c.参数列表不同

    继承时成员函数的访问方式:

    • 当写有子类对象调用函数的代码时,编译器先在子类的类域中寻找是否有该名称的函数,如果有这样的一个
      或者多个函数名称挑,就选出最佳的 (这个过程与调用重载函数类似),如果有该名称的函数,但是参数列表
      不匹配,这时就会报错,即使所继承的父类中有匹配的同名函数,编译器也不会在父类的类域中寻找.
    • 当写有子类对象调用函数的代码时,编译器先在子类的类域中寻找是否有该名称的函 数,如果子类的类域中
      没有该名称的函数,那么编译器就去父类的类域中寻找是否有匹配的该名称函数,如果没有就报错
    • 当子类和父类中有同名的函数时,当调用该函数时,默认的是优先调用子类的同名函数,其过程如上述第一
      项所描述,如果要想调用父类的同名函数,只能在调用时在函数名前加上父类的类域

    子类对象向父类对象的类型转换:

    一个子类对象包含两大部分:子类自己定义的成员和继承的其它父类对象(当然可能还有组合对象),因为子类对
    象中含有基类的部分,所以可以把子类对象当成父类对象来使用,还可以将指向父类对象的指针指向子类中的
    父类部分。
    例如:

         CStudent * pstu = new CStudent(“xx”,’f’,7);
         CPerson * pPer = pstu;
         pPer->GetSex();
    

    但是让一个指向子类对象的指针指向父类的对象,是不安全的,可能会发生越界访问造成程序异常,除非可以
    确定该父类对象是被包含在子类对象中。

    继承时的构造和析构顺序:

    • 构造:先构造父类对象,并且只能在子类构造函数的初始化列表中调用父类的构造函数来初始化父类对象部
      分,在构造子类自己的数据成员
    • 析构:先析构子类的,在析构父类的,因为子类中可能使用了父类的资源

    继承与组合同时使用时的构造和析构顺序:

    构造时先调用父类的构造函数,在调用成员对象的构造函数,最后调用自己的构造函数,析构时先析构自己,
    在调用成员对象的析构函数,最后调用父类的析构函数。

  • 相关阅读:
    Win32基础知识2 Win32汇编语言003
    Win32基础知识4 Win32汇编语言005
    Win32基础知识4 Win32汇编语言005
    第一个程序 零基础入门学习Delphi01
    Mysql四种通信协议(linux下本地连接的都是socket 其他都是tcp)
    Rhino
    Common Gateway Interface Python CGI编程
    inaccessible
    mysqli_report
    算法功底网站性能瓶颈
  • 原文地址:https://www.cnblogs.com/UnknowCodeMaker/p/11276588.html
Copyright © 2011-2022 走看看