Solidity继承疑问:为何需重写指定函数?能否直接调用super?
Solidity合约重写基函数的原因解析
contract MyToken is ERC20, ERC20Permit, ERC20Votes { constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {} // The following functions are overrides required by Solidity. function _afterTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._afterTokenTransfer(from, to, amount); } function _mint(address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._mint(to, amount); } function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) { super._burn(account, amount); } }
疑问:为何需要重写基合约中的这3个函数?是否无法直接通过super关键字调用它们?
这是Solidity多继承规则的强制要求:
MyToken同时继承了ERC20和ERC20Votes,而这两个基合约都实现了_afterTokenTransfer、_mint、_burn这三个内部函数。当多个基合约存在签名完全一致的函数时,编译器无法自动确定调用优先级,必须显式重写来消除歧义,否则直接编译报错。重写后用
super调用是为了触发所有逻辑:super在多继承场景下会按Solidity的C3线性化规则,依次调用所有基合约的对应函数。这样既会执行ERC20里的基础代币逻辑(比如更新余额、触发转账事件),也会执行ERC20Votes里的投票权重更新逻辑(比如快照用户投票权、同步委托信息)——ERC20Votes完全依赖这些时机同步投票数据,跳过的话投票功能直接失效。不是不能用
super,而是不重写根本过不了编译:编译器会抛出“函数歧义”的错误,重写是前提,之后用super才能确保所有基合约的逻辑都被执行到。
内容的提问来源于stack exchange,提问作者623
相关产品推荐
相关产品推荐

