Class的继承

一、简介

classt通过extends关键字实现继承,es5通过修改原型链实现继承
1、es5通过修改原型链实现继承

   // 定义一个Animal 构造函数,作为Dog的父类
   function Animal (){
     this.superType = "Animal";
   }
   Animal.prototype.superSpeak = function(){
     alert (this.superType)
   }
   function Dog (name){
	   this.name = name;
	   this.type = "Dog"
   }
   //原本Dog的prototype指向Doc的原型对象->构造函数->原型对象
   //现在改变Dog的prototype指针,指向一个 Animal 实例
   Dog.prototype = new Animal(); // 通过原型链的方式,实现 Dog 继承 Animal 的所有属性和方法
   Dog.prototype.speak = function () {
	  alert(this.type);
   }
   var doggie = new Dog('jiwawa');
   doggie.superSpeak();  //Animal 

总结:就是当重写了Dog.prototype指向的原型对象后,实例的内部指针也发生了改变,指向了新的原型对象,然后就能实现类与类之间的继承了。(但是如果在重写原型对象之前,产生的实例,其内部指针指向的还是最初的原型对象

2、es6通过extends继承

  class Point {}
  class colorPoint extends Point{
      //super表示父类的构造函数,用来新建父类的this对象
	 constructor(x, y, color) {
	         super(x, y); // 调用父类的constructor(x, y),
	         this.color = color;
	  }
	
	  toString() {
	      return this.color + ' ' + super.toString(); // 调用父类的toString()
	  }
  }

super 关键字

super:既可以当作函数处理,也可以当作对象使用
1:作为函数调用时,代表父类的构造函数,只能用在子类的构造函数之中,super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B,因此super()在这里相当于A.prototype.constructor.call(this)
2、super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类

构造函数和普通函数有什么区别

1:构造函数都应该以一个大写字母开头,非构造函数则应该以一个小写字母开头
2:调用方式:任何函数,只要通过new操作符调用,那么它就是构造函数;不使用new操作符调用,那么它就是普通函数
3:调用过程

//创建函数
function Person(name,age,job){
     this.name=name;
     this.age=age;
     this.job=job;
     this.sayName=function(){
          alert(this.name);
      }
}
 //当作构造函数使用
 var person=new Person1('Nicholas',29,'software Engineer');//this-->person
 person.sayName();//'Nicholas'
 //当作普通函数使用
 Person1('Nicholas',27,'Doctor');//this-->window
 window.sayName();//'Nicholas'

class 和普通构造函数区别

1:Class在语法上更加贴合面向对象的写法
2:Class在实现继承上更加易读、易理解
3:本质上还是语法糖,使用prototype

### 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值