索鸟网

  1. 首页
  2. 继承和派生

继承和派生


来源

继承是从生活中演化而来的概念,大家说狗的时候,大家都有一个概念:四条腿,一条尾巴,哺乳动物,会叫。大家说黑狗的时候大家不会说黑狗是:毛色是黑的四条腿,一条尾巴,哺乳动物会叫的动物。大家都会说黑色的狗。
这里狗就是基类,黑狗就是派生类,派生类是基类的一个特例。黑狗继承了狗的四条腿,一条尾巴,哺乳动物的属性。

派生类

为什么用派生

方便根据大家熟悉的基类来描述基类的一个特例派生类;比如:大家都知道狗这个概念,这时候在去描述黑狗这个派生概念的时候,只要说出与基类黑狗的不同之处就可以了。不必把已熟知的狗的属性再说一遍,因为这些属性方法已经全部继承给了黑狗。

不同之处

  • 增加新的成员(数据成员或成员函数)
  • 重新定义已有的成员函数
  • 改变基类成员的访问权限

继承方式

单一继承

概念:一个派生类值继承与一个基类

  • 类的保护成员
    • public:用它修饰的基类成员,不仅可以被派生类使用还可以被外部函数使用
    • private:用它修饰的基类成员,只能被基类使用,派生类虽然可以继承,但是不可以使用
    • protect:基类用它修饰的成员,只能被基类继承使用,外部函数不可以调用。
  • 派生类别
    • 共有派生:基类所有的数据成员按基类本身的访问级别继承给派生类,基类中用public修饰的数据成员和成员函数在派生类中依然是公有的。私有的成员仍然是私有的。
    • 私有派生:基类中所有的数据成员在派生类中都是私有的。
    • 保护派生:基类中的数据成员在派生类中保护级别降级。public降为protect,protect降为private,private仍然为private;
  • 使用类的权限(补)
    • 类本身的成员可以使用类的所有成员(私有成员和公有成员)
    • 类的对象只能访问公有成员函数
    • 其他函数不能访问类的私有成员,也不能使用类的公有函数,它们只能通过类来访问。
    • 一个类可以包含一个类的对象,但是这个类也只能通过被包含类的对象来访问那个类的成员函数,通过成员函数来访问数据成员。
  • 赋值兼容规则(ISA)
    • 派生类的对象可以赋值给基类的对象
    • 派生类的对象可以初始化基类的引用
    • 派生类的对象的地址可以赋值给指向基类的指针
    • eg:黑狗是从狗继承来的,把黑狗的对象赋值给狗,这时候让狗叫也就是让黑狗叫,调用的是狗的方法,但是使用的是黑狗的属性。
  • hasa
    • 狗有牙齿,但是不能让狗继承牙齿这个类,而是让狗拥有牙齿这个类,让牙齿类作为狗的属相对象。一个类可以拥有很多个对象属性。

多重继承

概念:一个类从多个基类派生。
格式:class 类名1:访问控制(public/private/protect) 类名2,访问控制 类名3,…访问控制 类名n
{//定义派生类自己的成员}

二义性
对基类成员的访问必须是无二义性的,如果各个基类有相同的成员,这种访问就具有二义性。

#include<iostream>
using namespace std;
class A{
    public:
        void func(){cout<<"a.func"<<endl;}
};
class B{
    public:
        void func(){cout<<"b.func"<<endl;}
        void gunc(){cout<<"b.gunc"<<endl;}
};
class public A,public B{
    public:
        void gunc(){cout<<"c.gunc"<<endl;}
        void hunc(){func();}//此时调用func()就会出现二义性,不知道调用的是哪个基类的func();
};
//-----------------------------------消除二义性---------------------------------------------------
class public A,public B{
    public:
        void gunc(){cout<<"c.gunc"<<endl;}
        void hunc(){A::func();}//使用基类A的func
        void hunc1(){B::func();}//使用基类B的func
};

小结

学而时习之不亦说乎。每次学习不同的知识发现相同之处真的很开心啊!

来源地址:http://blog.csdn.net/heji1103/article/details/78233353 版权归作者所有!

相关教程

  • c++直接继承和简介继承

    派生类通过继承某个类 产生,若派生类本身也是另个一类的基类,这样就形成了一个多层次的继承关系。 class A { ::: }; class B : public A { ::: }; class C:public B { ::: }; 在上述中,可以说,A是原始基类,B直接继承了A,C直接继承了B,C间接继承了A。 这就是直接继承和间接继承的关系。
  • 虚拟继承和菱形虚拟继承的剖析

          在上一篇已经讲了一些简单的继承方式,在最后的时候我们设计了一个菱形继承模型,最终引出了二义性问题,但是并没有对这个问题进行解决,这篇文章将会解决这个问题。 首先咱们先介绍一下一个新的继承方式:虚继承 继承格式:class 派生类名字:virtual public/protected/private基类
  • 再论JavaScript原型继承和对象继承

    JavaScript的原型继承是老生常谈。由于原型即prototype本身也是对象,所以“原型”继承可认为是一种特殊的“对象式”继承。”对象式“继承是笔者基于自己的理解,所提出的一个名词。本文就着重阐述这两种继承方式的异同之处。 原型继承 JavaScript里的原型即prototype是函数的特有属性,原型继承事先得有函数。 // 定义函数Foo fu
  • 继承

    –      在包bzu.aa中定义一个交通工具类(Vehicle): n  属性——载客量(capacity) n  方法 u  无参构造方法(给capacity初始化值为2,并输出“执行交通工具类的无参构造方法。”) u  有参构造方法(传参给capacity初始化,并输出
  • 剖析JS的原型链和继承

    JavaScript是一门面向对象的设计语言,在JS里除了null和undefined,其余一切皆为对象。其中Array/Function/Date/RegExp是Object对象的特殊实例实现,Boolean/Number/String也都有对应的基本包装类型的对象(具有内置的方法)。传统语言是依靠class类来完成面向对象的继承和多态等特性,而JS使
  • Javascript中的apply和call继承

    Github原文 call实现继承 call这里call的意思就是把animal的方法应用到cat这个对象身上,也就是animal的属性创建到了cat里面,所以cat就继承了animal的方法 function animal(a, b) { this.type = "animal" this.behavior = func
  • CSS的继承、层叠、特殊性和重要性

    CSS的继承、层叠、特殊性和重要性 标签(空格分隔): CSS 继承 层叠 特殊性 重要性 继承 继承:是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代。比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签,还应用于p标签中的所有子元素文本,这里子元素为span标签。 p{ color:red; } <p>三年
  • JavasScript继承方式(12种)归纳和总结

    本文总结12种用于JavaScript实现继承的方法,它们大致上可以分为两类:       基于构造器工作的模式;       基于对象工作的模式; 此外,也可以基于以下条件对这些模式进行分类:       是否使用原型;       是否执行属性拷贝;       两者都有(即执行原型属性拷贝); 1.原型链法(仿传统) 基于构造器工作的模式 使用原型链模式 (可以将