继承构造函数(inheritance constructors)
时间: 2023-10-23 10:12:43 浏览: 245
继承构造函数是 C++11 中的一个新特性,它可以让派生类继承基类的构造函数,从而避免在派生类中重复定义基类构造函数的代码。通过继承构造函数,派生类可以直接使用基类的构造函数,而不必重新实现一遍。
继承构造函数的语法非常简单,只需要使用 using 关键字声明基类构造函数即可,如下所示:
```c++
class Derived : public Base {
public:
using Base::Base; // 继承基类的构造函数
};
```
在这个示例中,Derived 类继承了 Base 类的构造函数。使用 using 关键字可以将基类的构造函数引入到派生类的作用域中,从而可以在派生类的构造函数中直接使用基类的构造函数。例如:
```c++
Derived d(1, 2); // 使用基类的构造函数初始化 d
```
这里使用了 Base 类的构造函数来初始化 Derived 类的对象 d。需要注意的是,继承构造函数只能用于构造函数的继承,不能用于其它函数的继承。此外,需要注意继承构造函数会继承基类的访问控制,因此需要保证基类的构造函数是 public 访问级别的。
相关问题
派生构造函数中如何避免多次调用基类构造函数?
在 C++ 中,为了避免在派生构造函数中多次无谓地调用基类的构造函数,特别是在派生构造函数中有多个初始化步骤的时候,你可以选择以下几种方法:
1. **成员初始化列表** (Member Initializer List): 你可以在派生类的构造函数定义时,直接列出对基类成员和派生类成员的初始化。这样只会调用一次基类的构造函数。
```cpp
class Derived : public Base {
public:
Derived(int derivedVal, int baseVal)
: Base(baseVal), derivedValue(derivedVal) {}
private:
int derivedValue;
};
```
2. **虚继承(Virtual Inheritance)**: 如果你不希望在每个实例上都存储一份完整的基类指针,而是想要共享基类的实现,可以考虑使用虚继承。但是注意,这通常用于解决耦合性较强的问题,并不是为了避免构造函数调用。
```cpp
class Derived : virtual public Base {
// ...
};
```
3. **构造函数内调用**: 如果上述方法不合适,你也可以在派生构造函数的内部只调用一次基类构造函数。但这可能会导致一些代码冗余,不如使用成员初始化列表清晰。
```cpp
Derived::Derived(int derivedVal, int baseVal)
: Base(baseVal), derivedValue(derivedVal)
{
}
```
原型链继承2.借用构造函数继承3.组合式继承4.ES6的class类继承
原型链继承(Prototype Inheritance)在JavaScript中是通过创建一个新对象并让它引用另一个对象的原型来实现的。例如:
```javascript
function Parent() {}
Parent.prototype.method = function() {
console.log('Parent method');
};
let child = new Parent();
child.method(); // 输出: "Parent method"
```
**借用构造函数继承**(Constructo r Chaining)利用已有构造函数作为父类,通过`new`关键字传递给子类实例化过程,间接实现了继承:
```javascript
function Parent() {
this.parentProp = 'parent';
}
function Child() {
Parent.call(this); // 借用父类构造函数
this.childProp = 'child';
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
let childInstance = new Child();
console.log(childInstance.parentProp); // 输出: "parent"
console.log(childInstance.childProp); // 输出: "child"
```
**组合式继承**(Mix-in or Prototype Mixing)结合原型链和构造函数继承,允许从多个源继承属性和方法:
```javascript
function Mixin(target) {
for (let prop in Mixin.prototype) {
target[prop] = Mixin.prototype[prop];
}
}
function Parent() {
this.parentProp = 'parent';
}
Mixin(Parent.prototype);
let child = new Parent();
console.log(child.parentProp); // 输出: "parent"
```
**ES6的class类继承**(Class-based Inheritance)使用`extends`关键字实现:
```javascript
class Parent {
constructor() {
this.parentProp = 'parent';
}
parentMethod() {
console.log('Parent method');
}
}
class Child extends Parent {
constructor() {
super();
this.childProp = 'child';
}
childMethod() {
console.log('Child method');
}
}
let childInstance = new Child();
childInstance.parentMethod(); // 输出: "Parent method"
childInstance.childMethod(); // 输出: "Child method"
```
阅读全文