Class 继承

ES6中引入了 Class(类)这个概念,作为对象的模板。通过class关键字,用于定义一个类。

官方文档中这样介绍class

ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

简单来说class 的出现可以让我们操作对象的时候更加的简单方便。
用一个例子简单记述一下使用方法

class People{
	// 定义一个类 (声明了一个构造函数People)
    constructor(name) { //constructor用于接收传递的形参
        this.name = name;  
    }
    sayhello() { //在people的对象上挂载一个方法
        console.log(`${this.name},hello!`);
    }
}
const  people = new People("小明")
people.sayhello()  // 打印结果为 '小明,hello!'

class 用作继承

  class People {
        // 定义一个类 
        constructor(name) { //constructor用于接收传递的形参
            this.name = name;
        }
        sayhello() { //在people的对象上挂载一个方法
            console.log(`${this.name},hello!`);
        }
    }
    class Student extends People {
        constructor(name, grade) {
            super(name) //调用super关键字
            this.grade = grade;
        }
        message() {
            console.log(`${this.name},${this.grade}`);
        }
    }
    const student = new Student("小明","五年级")
    student.message()  // 打印结果为 小明,五年级
    student.sayhello() // 打印结果为小明,hello! 继承了People中的sayhello的方法

这里详细说一下 super关键字的作用
super关键字既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。
注意:
1、使用super的时候,必须显式指定是作为函数、还是作为对象使用,否则会报错;
2、由于对象总是继承其他对象的,所以可以在任意一个对象中,使用super关键字。
一、作为函数使用时
当super作为函数调用时,代表父类的构造函数。(ES6要求子类的构造函数必须执行一次super函数,并且只能用在子类的构造函数中)

class A {}
class B extends A {
  constructor() {
    super();
  }
}

这里super代表的是父类A的构造函数,返回的却是子类B的实例,即super内部的this指的是子类B的实例,因此在这里super()相当于A.prototype.constructor.call(this)

二、作为对象调用

class A {
  p() {
    return 2;
  }
}
class B extends A {
  constructor() {
    super();
    console.log(super.p()); // 2
  }
}
let b = new B()

1、在普通方法中,super指向父类的原型对象(super指向A.prototype);
(1)、因为super指向的事父类的原型对象,所以定义在父类实例上的方法或属性(即构造器constructor中定义的属性和方法)无法通过super调用。
(2)、在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例,所以如果通过super对某个属性进行赋值,这时super就是this,赋值的属性会变成子类实例的属性。

2、在静态方法中,super指向父类。
在子类的静态方法中通过super调用父类的方法时,方法内部的this指向当前的子类

### C++ 类继承的使用方法及示例 在 C++ 中,类的继承是一种重要的面向对象编程特性,允许子类从父类中继承属性和方法。通过继承,可以实现代码的复用性和扩展性。 #### 1. 单继承继承是指一个子类仅从一个父类继承。以下是一个简单的单继承示例[^2]: ```cpp #include <iostream> using namespace std; class Base { public: Base() { cout << "父类构造函数调用" << endl; } ~Base() { cout << "父类析构函数调用" << endl; } }; class Derived : public Base { public: Derived() { cout << "子类构造函数调用" << endl; } ~Derived() { cout << "子类析构函数调用" << endl; } }; int main() { Derived d; return 0; } ``` 运行结果: ``` 父类构造函数调用 子类构造函数调用 子类析构函数调用 父类析构函数调用 ``` #### 2. 多继承继承是指一个子类可以从多个父类继承。以下是一个多继承的示例[^1]: ```cpp #include <iostream> using namespace std; class A { public: int age; A() { cout << "A 的构造函数调用" << endl; } }; class B : virtual public A { }; class C : virtual public A { }; class D : public B, public C { public: void set(int a) { age = a; } }; int main() { D one; one.set(3); cout << one.age << endl; return 0; } ``` 在这个例子中,`D` 类同时继承了 `B` 和 `C` 类。为了避免多重继承导致的二义性问题(如 `age` 成员的重复定义),使用了虚继承 (`virtual`)。 #### 3. 虚继承继承用于解决多继承中的二义性问题。当两个基类都继承自同一个祖先类时,虚继承确保子类只继承一次该祖先类的成员[^1]。 #### 4. 构造函数和析构函数的调用顺序 在继承关系中,构造函数和析构函数的调用顺序如下: - **构造函数**:先调用基类的构造函数,再调用派生类的构造函数。 - **析构函数**:先调用派生类的析构函数,再调用基类的析构函数。 #### 5. 访问控制 C++ 中的继承有三种访问控制方式: - `public`:公有继承,基类的公有成员和保护成员在派生类中保持原有访问权限。 - `protected`:保护继承,基类的公有成员和保护成员在派生类中变为保护成员。 - `private`:私有继承,基类的公有成员和保护成员在派生类中变为私有成员[^3]。 ### 注意事项 - 在多继承中,如果多个基类共享同一个祖先类,应使用虚继承以避免重复继承的问题。 - 子类必须在其构造函数中显式调用父类的构造函数,以初始化继承的成员变量[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值