WTF-Solidity icon indicating copy to clipboard operation
WTF-Solidity copied to clipboard

第十三讲细节

Open lilyang1989 opened this issue 3 years ago • 2 comments

十分感谢分享!我是一名solidity的初学者,在学习第十三讲的时候有一点疑惑: QQ截图20220912174707

在关于super关键字的描述中,教程中写到用super关键字只会调用最近父合约,但对于菱形继承问题,则有些偏差:

父合约有两个子合约,在调用子合约时会将全部的parent function 调用,而不是从右到左只调用一个。

来自solidity-by-example的例子

复现代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

/* Inheritance tree
   A
 /  \
B   C
 \ /
  D
*/

contract A {

    event Log(string message);

    function foo() public virtual {
        emit Log("A.foo called");
    }

    function bar() public virtual {
        emit Log("A.bar called");
    }
}

contract B is A {
    function foo() public virtual override {
        emit Log("B.foo called");
        A.foo();
    }

    function bar() public virtual override {
        emit Log("B.bar called");
        super.bar();
    }
}

contract C is A {
    function foo() public virtual override {
        emit Log("C.foo called");
        A.foo();
    }

    function bar() public virtual override {
        emit Log("C.bar called");
        super.bar();
    }
}

contract D is B, C {

    function foo() public override(B, C) {
        super.foo();
    }

    function bar() public override(B, C) {
        super.bar();
    }
}

在这个例子中,调用D合约的bar函数时,会看到A、B、C合约都会被调用。如果按照教程所说,只调用最近的父合约函数的话,调用顺序应该是C->A,并不会涉及到B合约;但实际部署调用后,会发现B合约也被调用

1

相关细节,我找到一个YouTube上的视频,讲解如下: image-20220904214028406

关于这个特性的讲解,具体到复现的代码为4:17秒左右

用super函数会调用所有的parent functions

参考

关于solidity继承中的调用关系与多继承 SolidityByExample中的Calling Parent Contracts

Solidity官方文档中关于super关键字的部分

lilyang1989 avatar Sep 12 '22 09:09 lilyang1989

好像这种菱形+多重继承是很麻烦,感谢提醒。 你提个pr把这部分加到这一讲?

AmazingAng avatar Sep 12 '22 12:09 AmazingAng

好的~

lilyang1989 avatar Sep 12 '22 14:09 lilyang1989