代码:
pragma solidity ^0.4.5; contract C { uint u; function f() { u = 1; } } contract B is C { function f() { u = 2; } } contract A is B { function f() { // will set u to 3 u = 3; } function f1() { // will set u to 2 //当使用super时,调用的是继承的该函数,不是它自己,比如下边给出的例子中,函数名字是相同的,要知道调用的不是它自己,是继承父合约中的同名函数。 super.f(); } function f2() { // will set u to 2 B.f(); } function f3() { // will set u to 1 C.f(); } }
首先我们来说说继承关系。官方的定义时这样的,
Solidity 支持多重继承包括多态。所有的函数调用都是虚拟的,这意味着最终派生的函数会被调用,除非明确给出合约名称或者使用super关键字。
当一个合约从多个合约继承时,在区块链上只有一个合约被创建,所有基类合约(或称为父合约)的代码被编译到创建的合约中。这意味着对基类合约函数的所有内部调用也只是使用内部函数调用。这里我们依然可以使用c合约的变量u,去初始化值。
注意点:状态变量覆盖被视为错误。 派生合约不可以在声明已经是基类合约中可见的状态变量具有相同的名称 。
我们来看看代码来分析一下。首先创建一个c合约,这个合约定义了一个变量u。然后b合约去继承c合约。这里就不要定义变量了,使用的时c合约的变量。然后a合约继承了b合约。
这里我们依然可以使用c合约的变量u,去初始化值。这里重点是使用super去调用的话,是调用b合约的,而不是c合约的。如果要调用c合约中的函数,需要使用函数名。