WTF-Solidity
WTF-Solidity copied to clipboard
第十三讲细节
十分感谢分享!我是一名solidity的初学者,在学习第十三讲的时候有一点疑惑:

在关于super关键字的描述中,教程中写到用super关键字只会调用最近父合约,但对于菱形继承问题,则有些偏差:
父合约有两个子合约,在调用子合约时会将全部的parent function 调用,而不是从右到左只调用一个。
复现代码如下:
// 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合约也被调用

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

用super函数会调用所有的parent functions
参考
关于solidity继承中的调用关系与多继承 SolidityByExample中的Calling Parent Contracts
好像这种菱形+多重继承是很麻烦,感谢提醒。 你提个pr把这部分加到这一讲?
好的~