You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:46:14