精华内容
下载资源
问答
  • 类的继承

    千次阅读 2020-03-05 21:17:28
    我们生成了一个派生类对象,那么这个派生类对象首先会调用基类的构造函数,然后调用派生类的构造函数,然后依次调用派生类,基类的析构函数。 基类没有缺省构造函数,派生类必须要在初始化列表中显式给出基类名和...

    继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。继承主要实现两个功能,一是实现代码复用,另外一是实现多态。

    继承定义的格式:class 派生类:继承类型  基类(父类)名称

    三种继承关系
     public (公有继承)
     private(私有继承)
     protected(保护继承)

    【继承关系 与 访问限定符 的关系】

    class base
    {
    public:
    	int _b1;
    protected:
    	int _b2;
    private:
    	int _b3;
    };
    
    class derived :public base
    {
    public:
    private:
    	int _d;
    };

    我们对base类进行了继承之后,我们可以看到基类的public成员变量状态在派生类中仍为public,基类的protected成员变量状态在派生类中仍为protected,基类的private成员变量状态在派生类中不可访问,因此 基类的非私有成员在子类的访问属性都不变。基类的private成员在派生类中是不能被访问的。但如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就可以定义为protected。(可以看出保护成员限定符是因继承才出现)。

    protected/private继承是一个实现继承,基类的部分成员并非完全成为子类接口的一部分,非特殊情况下不会使用这两种继承关系,在绝大多数的场景下使用的都是公有继承。私有继承意味着is-implemented-in-terms-of(是根据……实现的)。通常比组合(composition)更低级,但当一个派生类需要访问基类保护成员或需要重定义基类的虚函数时它就是合理的。不管是哪种继承方式,在派生类内部都可以访问基类的公有成员和保护成员,基类的私有成员存在但是在子类中不可见(不能访问)。

    基类和派生类的构造:

    class base
    {
    public:
    	base()
    	{
    		cout << "base" << endl;
    	}
    	~base()
    	{
    		cout << "~base" << endl;
    	}
    public:
    	int _b1;
    protected:
    	int _b2;
    private:
    	int _b3;
    };
    class derived :public base
    {
    public:
    	derived()
    		:base()//不自己初始化基类,编译器也会在初始化列表初始化基类
    	{
    		cout << "derived" << endl;
    	}
    
    	~derived()
    	{
    		cout << "~derived" << endl;
    	}
    private:
    	int _d;
    };
    
    
    int main() 
    {
    	derived D;
    	return 0;
    }
    

    我们生成了一个派生类对象,那么这个派生类对象首先会调用基类的构造函数,然后调用派生类的构造函数,然后依次调用派生类,基类的析构函数。

    • 基类没有缺省构造函数,派生类必须要在初始化列表中显式给出基类名和参数列表。
    • 基类没有定义构造函数,则派生类也可以不用定义,全部使用缺省构造函数。
    • 基类定义了带有形参列表构造函数,派生类就一定要定义构造函数。

    同名隐藏

    class base
    {
    public:
    	base()
    	{
    		cout << "base" << endl;
    	}
    	~base()
    	{
    		cout << "~base" << endl;
    	}
    public:
    	int _b1;
    	int _b2;
    	int _b3;
    private:
    
    };
    class derived :public base
    {
    public:
    	derived()
    		:base()//不自己初始化基类,编译器也会在初始化列表初始化基类
    	{
    		cout << "derived" << endl;
    	}
    
    	~derived()
    	{
    		cout << "~derived" << endl;
    
    	}
    public:
    	int _d;
    	int _b1;
    private:
    
    };

    基类和派生类中含有同名成员变量时,对象调用同名成员函数会优先调用派生类的成员函数。这就是继承体系中的同名隐藏

    在继承体系中,基类和派生类有相同名字的成员(同名成员变量 & 同名成员函数)(和类型没有关系)。如果使用派生类对象调用同名称的类成员,优先调用派生类自己。

    • 在继承体系中基类和派生类是两个不同作用域。
    • 子类和父类中有同名成员,子类成员将屏蔽父类对成员的直接访问。
    • 注意在实际中在继承体系里面最好不要定义同名的成员。

    友元与继承

    友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。

    class Base
    {
    	friend void PrintB();
    public:
    	void test_b()
    	{
    
    	}
    public:
    	int _b1;
    protected:
    	int _b2;
    private:
    	int _b3;
    };
    
    class Derived :public Base
    
    {
    public:
    	void test_d() 
    	{
    
    	}
    private:
    	int _d;
    };
    
    void PrintB(Base B) 
    {
    	B.test_b();
    	B._b1 = 1;
    }

    友元类只能调用基类的成员变量,成员函数,无法访问派生类。

    继承与静态成员

    基类定义了static成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。
     

    展开全文
  • python中类的继承规则

    千次阅读 2020-05-23 14:45:55
    python中类的继承规则 在学习python中的继承规则之前,首先要知道python中类的划分。 只要继承object类的就是新式类,不继承object类的都是经典类。 在python3中,所有的类都继承object类,都是新式类。 在python2中...

    python中类的继承规则

    在学习python中的继承规则之前,首先要知道python中类的划分。
    只要继承object类的就是新式类,不继承object类的都是经典类。
    在python3中,所有的类都继承object类,都是新式类。
    在python2中:
    class A:pass 经典类
    class B(object):pass 新式类
    在python3中:
    class A:pass 新式类
    class B():pass 新式类
    经典类的多继承采用深度优先继承。
    新式类的继承采用广度优先继承。
    在新式类中,可以试用类名.mro()查看继承的顺序。

    一、简单继承

    class A():
        def run(self):
            print("A类 执行")
    
    class B(A):
        pass
    
    class C(A):
        pass
    
    class D(B,C):
        pass
    
    print(D.mro())  #DBCA
    

    二、复杂继承

    class A():
        def run(self):
            print("A类 执行")
    
    class B(A):
        pass
    
    class C(B):
        pass
    
    class D(C):
        pass
    
    class E(B):
        pass
    
    class F(D,E):
        pass
    
    print(F.mro())  #FDCEBA
    

    三、复杂类多继承

    class A():
        def run(self):
            print("A类 执行")
    
    class B(A):
        pass
    
    class C(A):
        pass
    
    class D(B):
        pass
    
    class E(C):
        pass
    
    class F(D,E):
        pass
    
    print(F.mro())  #FDCEBA
    

    C3算法计算继承顺序:
    F(D,E)=mergo(D(B),E©)
    =[F] +[DBAO] +[ECAO]
    FDB = [AO]+[ECAO]
    FDBEC = [AO]+[AO]
    FDBECA = [O]
    FDBECAO

    四、案例练习计算继承顺序

    class A():
        def run(self):
            print("A类 执行")
    
    class B(A):
        pass
    
    class C():
        pass
    
    class D(B):
        pass
    
    class E(C):
        pass
    
    class F(D,E):
        pass
    
    print(F.mro())
    
    """
    F+DBAO+ECO
    FDBAECO
    """
    
    展开全文
  • 抽象类的继承

    千次阅读 2019-09-22 15:56:23
    抽象类的继承 抽象类的定义(可以构造方法) 抽象类中方法的定义格式为: public abstract void eat(); 继承抽象类,抽象方法必须要重写! public class Cat extends Animal { public Cat() { System.out.println(...

    抽象类的继承

    抽象类的定义(可以构造方法)

    抽象类中方法的定义格式为:

    public abstract void eat();
    

    继承抽象类,抽象方法必须要重写!

    public class Cat extends Animal {
    public Cat() {
        System.out.println("子类构造方法");
    }
    
    @Override
    public void eat()
    {
    System.out.println("猫吃饭");
    }
    }
    

    实现方法和之前的继承一样,效果也一样

    进阶

    定义一个抽象父类Animal

    public abstract class Animal {
    Animal(){System.out.println("父亲构造方法animal");}
    public abstract void sleep();
    public  abstract void eat();
    

    }

    定义下一个类继承它Dog

    public abstract class Dog extends Animal {
    Dog(){System.out.println("父亲构造方法!dog");}
    @Override
    public void eat()
    {
        System.out.println("狗吃骨头");
    }
    

    }
    此类为抽象类应为没有覆盖重写所有的代码,主要接上一讲继承中的提示。
    //覆盖重写要实现全部抽象类的方法,否则加abstract变为抽象类

    最后定义两个子类继承dog类,并覆盖重写animal中未覆盖重写的方法

    1/金毛

    public class GoldenDog extends Dog{
    GoldenDog(){System.out.println("子构造方法!金毛");}
    @Override
    public void sleep() {
        System.out.println("金毛睡觉,呼呼呼");
    }}
    

    2/泰迪

    public class Taidi extends Dog {
    @Override
    public void sleep() {
        System.out.println("泰迪睡觉:嗨嗨嗨");
    }
    }
    

    实现效果类及效果

    public class DemoMain {
    
    public static void main(String[] args) {
        GoldenDog goldenDog = new GoldenDog();
        goldenDog.eat();
        goldenDog.sleep();
       // goldenDog.eat();
        System.out.println("================");
        Taidi taidi = new Taidi();
        taidi.eat();
        taidi.sleep();
    }
    }
    

    在这里插入图片描述
    构造方法参见上一讲的提示!定义子类对象,构造方法往上找!

    展开全文
  • 动物类的继承

    千次阅读 2018-04-24 18:25:53
    动物类的继承 要求: 1.在一个名为Test.java的文件中定义四个类:动物类Animal,狗类Dog和猫类Cat继承Animal,测试类Test,要求编写代码的同时编写简单注释。 2.动物类Animal要求体现以下内容: (1) 私有成员...

    动物类的继承

    要求:

    1.        在一个名为Test.java的文件中定义四个类:动物类Animal,狗类Dog和猫类Cat继承Animal,测试类Test,要求编写代码的同时编写简单注释。

    2.        动物类Animal要求体现以下内容:

    (1)     私有成员变量:姓名name,年龄age

    (2)     构造方法:无参构造、带参构造

    (3)     成员方法:setXxx()/getXxx()方法 

    eat()方法显示“吃饭了!”

    3.   狗类Dog继承Animal,给出其无参构造、带参构造方法,并且给出成员方法lookDoor()显示“狗看门”。

    4.   猫类Cat继承Animal,添加成员变量color,并给出其对应的setXxx()/getXxx()方法,并且给出成员方法palyGame()显示“猫玩英雄联盟”。

    5.        测试类InheritTest要求实现:

    (1)创建Dog对象d,用带参构造给其赋值(”旺财”,3),用getXxx()方法获取并显示对象d的信息,并调用其eat()方法、lookDoor()方法。

    (2)创建Cat对象c,用setXxx()方法给其赋值(”Tom”,2,”白色”),用getXxx()方法获取并显示对象c的信息,并调用其eat()方法、palyGame()方法。

    源代码:

    packageTestAnimal;

     

    //动物类

    class Animal {

          // 成员变量

          private String name;

          private int age;

     

          // 构造方法

          // 无参构造

          public Animal() {

               super();

               // TODO Auto-generated constructorstub

          }

          // 有参构造

     

          public Animal(String name, int age) {

               super();

               this.name = name;

               this.age = age;

          }

     

          // setXxx And getXxx

          public String getName() {

               return name;

          }

     

          public void setName(String name) {

               this.name = name;

          }

     

          public int getAge() {

               return age;

          }

     

          public void setAge(int age) {

               this.age = age;

          }

     

          // +show方法并显示

          public void show() {

               System.out.println("姓名:" + name + ",年龄:" + age);

          }

     

          public void eat() {

               System.out.println("吃饭了");

          }

    }

     

    // 狗类

    class Dog extendsAnimal {

     

          public Dog() {

               super();

               // TODO Auto-generated constructorstub

          }

     

          public Dog(String name, int age) {

               super(name, age);

               // TODO Auto-generated constructorstub

          }

     

          public void eat() {

               System.out.println("狗吃肉");

          }

     

          public void lookDoor() {

               System.out.println("狗看门");

          }

     

    }

     

    // 猫类

    class Cat extendsAnimal {

          // 成员变量

          private String color;

     

          // 构造方法

          // setXxx And getXxx

          public String getColor() {

               return color;

          }

     

          public void setColor(String color) {

               this.color = color;

          }

     

          // 成员方法

          public void eat() {

               System.out.println("猫吃鱼");

          }

     

          public void palyGame() {

               System.out.println("猫玩英雄联盟");

          }

    }

     

    public class Test{

          public static void main(String[] args) {

     

              

               Dog d = new Dog("旺财", 3);

               System.out.println(d.getAge()+d.getName());

               d.eat();

               d.lookDoor();

               d.eat();

               d.lookDoor();

               Cat c=new Cat();

               c.setName("Tom");

               c.setAge(2);

               c.setColor("白色");

               System.out.println("姓名:"+c.getName()+",年龄:"+c.getAge()+",颜色:"+c.getColor());

               c.eat();

               c.palyGame();

          }

    }

    展开全文
  • Python中类的继承、多层继承和多继承 Python中,一个类可以通过继承的方式来获得父类中的非私有属性和非私有方法。 一、继承、重写、和调用重写的父类方法 继承的语法为在类名后的小括号()中写入要继承的父类名,...
  • Python:类的继承,调用父类的属性和方法基础详解

    万次阅读 多人点赞 2018-12-30 11:35:01
    以下案例均表示Son类继承父类一些属性和初始化参数构造等。 5个模块: (1):直接调用父类属性方法; (2):重写父类属性方法; (3):强制调用父类私有属性方法; (4):调用父类__init__方法 (5)...
  • Python类的继承实例

    千次阅读 2019-07-31 14:45:08
    类的继承可以看成对类的属性和方法的重用,能够大大的减少代码量,继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹。 通过继承创建的新类为子类...
  • C/C++类的继承

    万次阅读 多人点赞 2019-01-24 17:15:26
    类的继承 class Shape{ }; class Circle : public Shape{ }; 语法:class B : public A{} B继承于A,A类是父类,B是派生类(子类) 当 B继承于A时,自动将父类中的所有public 成员继承,无法继承private的 ...
  • 提到类的继承就必须提到类的组合,继承和组合有何异同?PHP到底有没有多态?这些将在下面进行讲述。 1. 类的继承 类与类之间有一种父与子的关系,子类继承父类的属性和方法,称为继承。在继承里,子类可以拥有...
  • 类的继承(三种继承方式)

    千次阅读 2018-07-05 22:30:35
    类的继承主要分为三类,公有继承,私有继承,保护继承。然后主要记录一下不同的继承方法对派生类的不同作用。1,派生类私有继承于基类。这个时候,派生类继承了基类的公有部分和保护部分,并且继承的这一些数据成员...
  • C++ 类的继承与派生

    千次阅读 2017-05-16 10:20:39
    继承性是面向对象程序设计最重要的特性之一,使软件有了可重用性,C++提供的类的继承机制。 继承与派生的概念 一个新类从已有的类那里获得已有的特性,这种现象称为类的继承。同样也可以说成已有的类派生出来了新...
  • 模板类的继承总结

    千次阅读 2017-05-25 15:21:19
    模板类的继承包括四种: 1.(普通类继承模板类) 2.(模板类继承了普通类(非常常见)) 3.(类模板继承类模板) 4.(模板类继承类模板,即继承模板参数给出的基类) 其中,普通类继承模板类比较简单...
  • 模板类的继承

    万次阅读 2014-03-12 14:45:33
    模板类的继承 模板类的继承包括四种: 1.(普通类继承模板类) template class TBase{ T data; …… }; class Derived:public TBase{ …… }; 2.(模板类继承了普通类(非常常见)) class TBase{ …… }; ...
  • java抽象类的继承

    千次阅读 2016-12-14 10:53:25
    java基础 抽象类的继承
  • python3 类的继承

    千次阅读 2017-10-25 08:58:15
    类的继承@(python3)继承基本语法:class DerivedClassName(BaseClassName1): . . . 需要注意圆括号中父级类的顺序,若是父级类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未...
  •  模板类的继承是C++中较为高级的一种用法,其语法与普通C++类的继承略有差别。本文实例演示了一个通过C++模板类继承实现排序算法的案例。代码如下: 1. 实现List基类 #ifndef LIST_H #define LIST_H #include ...
  • Python 类的继承查找顺序

    千次阅读 2017-07-06 16:24:50
    Python 类的继承查找顺序
  • java类的继承

    千次阅读 2012-04-09 20:20:51
    今天讲的内容很重要哦,是关于类的继承,这将会是学习java的关键; 继承:是面向对象编程的三大特征之一,也是实现软件复用的重要手段;java的继承具有单继承的特点,即每个子类只能有一个直接父类; 类的继承提高...
  • Java—内部类(三)—内部类的继承

    万次阅读 多人点赞 2016-12-14 14:23:50
    内部类的继承内部类和其他普通类一样,同样可以被继承,这样给本来就十分灵活的内部类增加了更好的结构性和代码复用性。只是内部类的继承和普通类有一些不同之处,是在使用时需要多加注意的。因为内部类在创建时需要...
  • 简单方式查看类的继承关系

    千次阅读 2019-02-28 14:50:00
    使用IntelliJ IDEA的diagram查看类的继承关系图形,结果一目了然,也是好用到炸裂,mark一下。 1、查看图形形式的继承链 在你想查看的类的标签页内,点击右键,选择 Diagrams,其中有 show 和 show ... Popup,...
  • Pycharm 查看一个类的继承关系图

    千次阅读 2018-09-07 22:32:46
    Pycharm 查看一个类的继承关系图 查看DRF框架的APIView类的继承关系 查看DRF框架的GenericAPIView类所在.py模块的所有类继承关系 Pycharm 查看一个类的继承关系图 在我们开发过程中: 无论是使用的开发...
  • PHP类的继承和接口

    千次阅读 2015-06-04 19:19:08
    PHP类的继承的一些语法-PHP的类只支持单继承,就是每个类最多只能有一个父类或者没有父类。-子类不能继承父类使用private修饰的成员。 修饰符 可访问范围 public 当前类、子类和类外 protected 当前类和子类 ...
  • java中类的继承详解。

    万次阅读 多人点赞 2018-07-11 21:42:48
    继承的特点Java的继承通过extends关键字实现. 实现继承的被称为子类. 被继承的被称为父类. 父类和子类的关系, 是一种一般和特殊的关系. 例如水果和苹果的关系, 苹果继承了水果, 苹果是水果的子类, 水果是...
  • 【C语言】实现类的继承

    千次阅读 2018-08-03 16:04:39
    那么应该如何实现类的继承效果呢?我们可以利用结构体嵌套来实现,将”父类“当作”子类“的一部分,那可不就是继承了吗? #include&lt;stdio.h&gt; typedef struct A{ int a; }A;...
  • Java实验2 类的继承

    万次阅读 2016-04-09 18:31:50
    实验2 类的继承性 一、实验目的 掌握面向对象的继承性在Java中的实现方法;掌握super关键字的用法,体会抽象类和抽象方法的作用。 二、实验内容 1.程序理解: 1)类的继承2)第4章课后编程第1题 class Student { ...
  • 类的继承,调用父类的属性和方法
  • python中类的继承

    千次阅读 2019-06-05 17:34:41
    # 在程序中,继承描述是多个之间所属关系。 # 如果一个A里面属性和方法可以复用,则可以通过继承的方式,传递到B里。 # 那么A就是基类,也叫做父类;B就是派生,也叫做子类。 # 继承的作用:B...
  • Java 类设计----Java类的继承

    千次阅读 2017-08-05 13:57:59
    Java类的继承 为描述和处理个人信息,定义类Person: public class Person {  public String name;  public inat age;  public Date birthDate;  public String getInfo()  {...} } 为描述和处理...
  • IntelliJ IDEA | 使用技巧—查看类的继承关系图

    万次阅读 多人点赞 2018-05-29 11:10:48
    好处:可以看向上和向下的继承关系 缺点:只能看继承关系,不能看实现了哪些接口 在指定右键查看diagram 也可以使用快捷键ctrl+alt+u,更快捷 好处:可以看向上的继承关系 缺点:既能看继承关系,也能看...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 317,554
精华内容 127,021
关键字:

类的继承