精华内容
下载资源
问答
  • 作为面向对象程序设计来说,继承是非常重要一个特点,面向对象程序设计(Object-Oriented Programming, OOP)核心思想是数据抽象、继承和动态绑定。...下面什么主要介绍是继承中基类和派生类...

         作为面向对象的程序设计来说,继承是非常重要的一个特点,面向对象程序设计(Object-Oriented Programming, OOP)的核心思想是数据抽象、继承和动态绑定。其中使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。下面什么主要介绍的是继承中基类和派生类之间的关系。

    注:动态绑定只有当我们通过指针或者引用调用虚函数时才会发生。

         在基类中有两种类型的成员是我们需要注意的,一种是基类希望派生类继承的;一种是基类希望派生类覆盖的。如:基类Quote和其派生类Bulk_quote.

    class Quote
    {
         public:
                  std::string isbn() const;
                  virtual double net_price(std::size_t n) const;
    }
    

      这里成员函数isbn()是基类希望派生类继承的,派生类中不需要重新定义,而net_price是希望派生类覆盖的,派生类中有不一样的实现方式。这里基类Quote将希望派生覆盖的成员函数定义成虚函数,即在前面加上:virtual关键字。

          那么,那些成员函数需要定义成虚函数了,即基类和派生类中都有各自的实现方式的时候,就需要在基类中将该成员函数定义成虚函数,希望派生类将其覆盖。动态绑定即是在我们使用基类的引用(或者指针)调用一个虚函数时发生的。这样程序就可以根据参数的不同来判断是调用基类的成员函数,还是调用派生类的成员函数。当然派生类也不是一定要重新定义基类中的虚函数,如果派生类没有覆盖基类中的虚函数,那么该虚函数就和其他普通函数一样,派生类就直接继承它在基类中的版本。

    派生类和基类之间的类型转换

         上面例子中基类Quote里面有成员:bookNo和price,派生类Bulk_quote中有:min_qty和discount.当派生类继承基类的时候,派生类中就有两部分(四个)成员:一部分是继承Quote的bookNo、price,一部分是自己定义的min_qty、discount。因为在派生类对象中含有与其基类对应的组成部分,所有我们能把派生类的对象当成基类对象来使用,而且我们也能将基类的指针或者引用绑定到派生类对象中的基类部分上。如下:

    Quote item;        //基类对象
    Bulk_quote bulk;   //派生类对象
    Quote *p = &item;  //p指向Quote对象
    p = &bulk;           //p指向bulk的Quote部分
    Quote &r = bulk; //r绑定到bulk的Quote部分
    

    注:在派生类对象中含有与其基类对应的组成部分,这一事实是继承的关键所在;并且每个类控制它自己的成员初始化过程,即派生类不能直接初始化基类的成员,虽然这些成员是从基类继承的,但是这些成员也必须使用基类的构造函数来初始化派生类的基类部分。 

    基类中的静态成员

          如果基类中定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义。不论从基类中派生出多少个类,对于每个静态成员来说都只存在唯一的实例。对于静态成员的访问控制规则,则是和其他的成员一样,如果静态成员是private的,则派生类无权访问。如果静态成员是可以访问的,则我们既能通过基类使用它们,也可以通过派生类使用它。

    派生类的声明

          派生类的声明与其他类差别不大,声明中包含类名,但是不包含他的派生列表,如:

    class Bulk_quote : public Quote;   //错误:派生列表不能出现在这里
    class Bulk_quote;                  //正确:声明派生类的正确方式
    

     

    注:派生类的列表以及与定义有关的其他细节必须与类的主题一起出现。

     

    被用作基类的类

         一个类可以被用来作为基类,那么首先该类必须已经定义了而非只是声明,而且一个类可以是基类,也可以是派生类,如:

     

    class Base {..............};
    class D1 : public Base {..............};
    class D2 : D1 {........................};
    

     

      在上面的列子可以看到Base作为D1的基类,D1作为Base的派生类,而D1又作为D2的基类,D2作为D1的派生类。每个类都是继承直接基类的所有成员,对于一个最终的派生类来说,它会继承其直接基类的成员;该直接基类的成员又含有其基类的成员;依次类推直至继承链的顶端。因此,最终的派生类将包含它的直接基类的子对象以及每个基类的子对象。

    注:如果我们想防止一个类被继承,那么可以在类名后跟一个关键final,如:

    class NoDerived final {.............}
    class Base {............}
    class Last final : Base {...........} //Last不能作为基类
    class Bad : NoDerived {..............} //错误:NoDerived不能做为基类
    class Bad2 : Last {.................} //错误:Last不能作为基类

    基类和派生类在对象之间不存在类型转换

         当我们用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分会被拷贝、移动或赋值,它的派生类部分将被忽略掉。

    如:

    Bulk_quote bulk;       //派生类对象
    Quote item(bulk);     //使用Quote::Quote(const Quote&)构造函数
    item = bulk;             //调用Quote::operator=(const Quote&)
    

      当构造item时,运行Quote的拷贝函数。该函数只能处理bookNo和price两个(这两个是基类中的成员),它负责拷贝bulk中的Quote部分的成员,同事忽略掉bulk中Bulk_quote部分的成员。类似的,对于将bulk赋值给item的操作来说,只有bulk中Quote部分的成员被赋值给item。

     

    转载于:https://www.cnblogs.com/pengjun-shanghai/p/5286690.html

    展开全文
  • 关于C++中,基类 派生类的关系 重载 覆盖 ,如果想用面向对象开发的这种架构,基类和派生类的关系的理解非常重要,必须要用到的。  下面这个文章写的非常好,我就转载过来了     ...

    关于C++中,基类 派生类的关系 重载 覆盖  ,如果想用面向对象开发的这种架构,基类和派生类的关系的理解非常重要,必须要用到的。

       下面这个文章写的非常好,我就转载过来了 

             http://www.cnblogs.com/sujz/articles/2044365.html

    展开全文
  • 定义四个类,A,B,C,D。...分四种情况(不考虑派生类基类实例化情况,因为这种情况不常见。比如 派生类 p=new 基类(),这个不讨论) 1)A里是抽象方法,其他三个是重写 结论是,调用方法实例化时

    定义四个类,A,B,C,D。继承关系D→C→B→A。假设ABCD里有相同名相同参数的方法。

    分四种情况(不考虑派生类用基类实例化的情况,因为这种情况不常见。比如 派生类 p=new 基类(),这个不讨论)

    1)A里的是抽象方法,其他三个是重写的

    结论是,调用的方法和实例化时使用的类名相关,用哪个类名实例化就调用哪个类里的方法。比如 B b=new D();则调用D里的方法。这种情况就是看new 哪个;

    2)AB是virtual,CD是override,则A类型的对象不论实例化为哪种类型,都掉用自己的,比如 A a=new B();调用A的,new C();还是调用A的,new D();一样调用A的。BCD遵循 1)。

    3)AC 里的是virtual,BD的是override。则B调用自己的方法。A的情况是,A a=new A();调用A的,A a=new B/C/D(); 调用父类的。C遵循 1)。

    4)ABC的是virtual,D是override。则A、B调用自己的方法。B遵循1)。

    5)AD是virtual,BC是override。A a=new D();,则a调用C的。即,在多层类里,继承里的从直接派生的类开始的连续的最远(包含在new的类及其以上的类(此处指DBC))是override的方法(此处是C的)。换句话说就是调用多层继承里的从直接派生的类开始的(包含在new的类及其以上的类(此处指DBC))连续的是override的方法的(此处是BC)离new 类名最近的类(类C)里方法

    我的结论是,如果一个类 M,它有virtual方法 Fun,如果它的派生类(直接派生的,比如B→A)也有Fun,切派生类的Fun是oerride,则 M的Fun会根据实例化时new的类型判断使用那个Fun。如果M下面有多层(不是多重,C#不允许多重继承类)继承类,且有Fun,则调用时,如果M是用new M()实例化,就调用M的Fun。否则如果直接派生的子类也是virtual,则只调用自己的Fun。否则参照5)。多层继承上的其他类也是这么讨论。谢谢阅读。请提出意见

    展开全文
  • 记录关于C++继承中构造函数析构函数的关系 摘自《C++ Primer Plus》P485 创建派生类对象时,程序首先调用基类构造函数,然后在调用派生类构造函数。基类构造函数负责初始化数据成员;派生类构造函数负责初始化...

    记录关于C++继承中构造函数和析构函数的关系

    摘自《C++ Primer Plus》P485

    ①创建派生类对象时,程序首先调用基类构造函数,然后在调用派生类构造函数。基类构造函数负责初始化数据成员;派生类构造函数负责初始化新增的数据成员。

    ②派生类对象过期的时候,程序首先调用派生类的析构函数,再调用基类析构函数。

    展开全文
  • 基类就是父类,派生类就是子类,你可以理解为生活中父子关系, 也就是说儿子继承了所有父亲样貌特征,但是儿子也有父亲所没有一些特点 专业点讲,就是子类可以继承并使用父类属性方法,也可以有自己...
  • 虚函数作用是实现动态联编,也就是在程序运行阶段动态地选择合适成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义函数应与虚函数具有相同形参个数形参类型。...
  • 比如:抽象出来一个类叫person,是基类(//基类的下层关系是子类/派生类,子类派生类一个东西),基类就是最顶层那个东东,再下面就是它孩子也就是派生出来类,派生类或者子类,比如学生类student /**********...
  •  虚函数作用是实现动态联编,也就是在程序运行阶段动态地选择合适成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义函数应与虚函数具有相同形参个数形参类型。...
  • 关于虚函数总结

    2018-03-14 12:34:33
    基类和派生类的关系就像父子(老子可以让儿子干事,儿子却不能总是让老子去干事)所以,派生类的指针式不能指向基类的,基类的指针却可以指向派生类,基类指针指向派生类的时候,想要调用同名的派生类函数,就必须在...
  • c++之继承与派生

    2021-05-11 17:45:20
    前言 面向对象程序设计有四个主要的特点:抽象,封装,继承多态。继承性是面向对象设计最重要的特征,可以是如果不掌握继承性,就没有掌握类的...关于基类派生类的关系,可以表述为:派生类是基类的具体化,而基
  • 关于多态:所谓多态,就是不同派生类中对继承自基类的同一方法个性化再实现。 2.对象类不同。类是模板,对象是实例化后类。 3.类中存储数据变量就是成员变量,规范化术语叫 字段。 4.静态方法不能...
  • 关于继承

    2018-07-01 14:09:14
    基类和派生类类继承关系的语法形式 class 派生类名 : 基类名表  {  数据成员和成员函数声明  };基类名表 构成 访问控制 基类名1, 访问控制 基类名2 ,… , 访问控制 基类名n访问控制 表示派生类对基类...
  • 继承和派生的概念01派生通过特殊化已有的类来建立新类的过程,叫做“类的派生”, 原有的类叫做”基类”,新建立的类叫做“派生类”。02继承类的继承是指派生类继承基类的数据成员和成员函数。继承用来表示类属关系...
  • 在讲到虚函数之前,先附一张表(如果急切,直接翻到说虚...基类和派生类成员方法的关系: 重载:(同一作用域),方法名相同,返回值类型,参数列表不同。 隐藏:(使用前提:派生类对象调用继承于基类的方法)同名
  • 一、选择题 1.下列关于对象初始化叙述中,正确是 ...2.下列关于基类和派生类关系的叙述中,正确是  A 每个类最多只能有一个直接基类  B 派生类中成员可以访问基类中任何成员  C 基
  • 派生类拥有基类的全部成员函数成员变量,但基类的private成员,派生类无法访问(因此可以将派生类定义成基类的友元类,友元关系不具有传递性继承性),基类的protected成员:派生类的成员函数可以访问当前对象的...
  • 【C++】关于继承本质原理

    千次阅读 2019-07-16 14:02:34
    关于C++的继承的理论基础 继承的本质:代码的复用 所有C++的类或者说是所有面向对象类与类之间的关系总结起来有俩种 1,组合 a part of ...... 派生类的访问限定 (main)外部的访问限定 public ...
  • 继承是从一个基类得到一个或多个派生类的机制2.继承自另外一个类的类被称为该类的子类,这种关系通常用父子关系描述,子类将继承父类的特效,这些特性由属性方法组成。(父类也可以叫超类,基类,子类也被称为父类...
  • 本博文通过包含了一个公司支付系统中各种雇员情况的一个继承层次来讨论基类和派生类之间的关系.佣金雇员(表示为一个基类对象)的薪水完全是销售提成,带底薪佣雇员(表示为一个派生类的对象)的薪水由底薪和销售提成组成...
  • 子类也叫派生类。 1.thissuper的区别 this:代表当前的对象引用,this可以调用到本类的属性方法 this(name,age)也可以调用 本类的构造方法 super:调用父类属性方法以及super(name,age)调用父
  • 继承 什么是继承?面向对象程序设计中最重要一个概念是继承。继承允许我们依据另一个类来定义...这个已有类称为基类,新建类称为派生类。继承代表了 isa 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,...
  • 概述:在开发中,我们发现多个具有很多相似功能,于是我们就把这些相似功能放到一个中,然后让这多个类和这个产生一个关系,这个关系就叫做继承 关键字: extends 语法: public class A extends B{ } 认识: ...
  • 关于继承理解

    2018-07-02 09:45:58
    类继承关系的语法形式class 派生类名: 基类名表{ 数据成员成员函数声明};基类名表构成 访问控制 基类名1, 访问控制 基类名2,… ,访问控制 基类名n访问控制表示派生类基类的继承方式: public 公有...
  • 继承:在类中建立层次,...继承是可以传递,如:类A派生B,类B派生类C,那类C就能继承到类B类A声明成员, 构造析构函数不能继承(没有返回值),但可以通过this调用。  语法 :Class 派生类名:基类名  {
  • 一、选择题 1.下列关于对象初始化叙述中,正确是  A 定义对象时候不能对对象进行初始化  B 定义对象之后可以显式地调用...2.下列关于基类和派生类关系的叙述中,正确是  A 每个类最多只能有一个直接基类
  • 文章目录关键字protected(带来方便同时带来危险,最好不用)抽象类和纯虚函数(is-a关系用公有继承实现有时候也不太合适)用圆椭圆笨拙派生为例,挑拨is-a公有继承搭档关系替代笨拙继承办法1:单独定义...
  • 继承我们知道了父类和子类,即基类和派生类,这两个类之间的关系叫继承体系 多态:动态绑定 然后介绍了继承体系,LibMat类,Book类和AudioBook类的三层类继承体系 介绍不带继承的多态(类之间的继承关系不大) 如何...
  • C++类的多重继承

    2017-06-13 17:32:22
    在使用类的继承的时候,一直有一个疑惑,假设基类为B,A类是B的派生类,C类是A类的派生类,D类是C类的派生类,那么像这种多重继承的关系,其函数调用关系是怎么样的呢。假设在D类中需要调用函数fun()(D类中未定义...
  • C++之多态性与虚函数

    2015-09-18 22:43:11
    同样,在基类和派生类之间也存在着赋值兼容关系,它是指需要基类对象任何地方都可以使用公有派生类对象来代替。为什么只有公有继承才可以呢,因为在公有继承中派生类保留了基类中除了构造和析构之外所有成员...
  • 参考: 1,C++ Primer Plus(第六版)中文版 2,... ... C++中多态: 若继承关系为Public时,基类的成员函数,在整个继承链中,可属于每个派生类;只不过成员函数中...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 133
精华内容 53
关键字:

关于基类和派生类的关系