0%

solidity | 关键词 virtual、override、super

virtualoverride 相当于重写父类的方法,作用和 java 的一样。

  • virtual
    • 父合约中的函数,如果希望子合约重写,需要加上 virtual 关键字。
  • override
    • 子合约重写了父合约中的函数,需要加上 override 关键字。

注意:用 override 修饰 public 变量,会重写与变量同名的 getter 函数,例如:

mapping(address => uint256) public override balanceOf;

合约如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pragma solidity ^0.8.0;

contract A{

string public name;
string public t;
uint256 public c;
function test() public{
pre();
c = c + 1;
}

function pre() internal virtual{
t = "test";
}
}

contract Test is A {

function pre() internal override{
name = "test";
}
}

部署 Test 合约,部署完成,调用变量

  • C
    • 0
  • name
    • ""
  • t
    • ""

调用 test 函数,这几个值变为

  • C
    • 1
  • name
    • test
  • t
    • ""

说明,重写方法后,父函数就不再执行。如果想要执行父方法,可以使用 super

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.8.0;

contract A{

string public name;
string public t;
uint256 public c;
function test() public{
pre();
c = c + 1;
}

function pre() internal virtual{
t = "test";
}
}

contract Test is A {

function pre() internal override{
super.pre();
name = "test";
}
}
请我喝杯咖啡吧~