solidity中合约继承时构造函数执行形式
在solidity中,如果一个合约Child继承了合约Parent,那么当合约Child在部署时,合约Parent的构造函数会自动执行。不需要像其他语言一样在子类中手动执行父类的构造函数。例如如下的合约:
pragma solidity ^0.5.4;
contract Parent {
uint256 public parentNum;
constructor() internal {
parentNum = 100;
}
}
contract Child is Parent {
uint256 public childNum;
constructor() public {
childNum = 200;
}
}
部署完成之后,检查parentNum和childNum两个变量,发现其值符合预期,说明,父合约和子合约的构造函数都被调用了,并且父合约的构造函数的调用不需要在子合约中手动执行。

image.png
如果父合约的构造函数需要接受参数,那么子合约在继承时需要传入。
我们将父合约的构造函数修改一下,代码如下:
pragma solidity ^0.5.4;
contract Parent {
uint256 public parentNum;
constructor(uint256 _parentNum) internal {
parentNum = _parentNum;
}
}
contract Child is Parent {
uint256 public childNum;
constructor() public {
childNum = 200;
}
}
这里注意,我们只修改了父合约的构造函数,如果直接这样子部署会报错,部署失败,因为子合约在继承时没有给父合约传入相应的变量,报错内容如下:

image.png
修改完成之后的代码如下:
pragma solidity ^0.5.4;
contract Parent {
uint256 public parentNum;
constructor(uint256 _parentNum) internal {
parentNum = _parentNum;
}
}
contract Child is Parent(101) {
uint256 public childNum;
constructor() public {
childNum = 200;
}
}
部署完成之后父合约的parentNum变量为101,即子合约在继承时传入的值。
PHP中类继承时构造函数执行形式
在php中,子类继承父类后,在子类中需要手动调用parent::__construct();来执行父类的构造函数,不然父类的构造函数不会执行。
代码样例如下:
<?php
class ParentClass
{
public function __construct()
{
echo "parent constructor" . PHP_EOL;
}
}
class ChildClass extends ParentClass
{
public function __construct()
{
echo "child class" . PHP_EOL;
// parent::__construct();
}
}
$childClass = new ChildClass();
执行的输出结果是child class。因为注释了parent::__construct();,所以父类的构造函数不会执行。
js中类继承时构造函数执行形式
在es6的类继承中,子类需要在其构造函数中强制调用super()来执行父类的构造函数,不然报错,报错内容如下:
ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
测试代码如下:
class Parent {
constructor () {
console.log('parent class')
}
}
class Child extends Parent {
constructor () {
super()
console.log('child class.')
}
}
const child = new Child()