【Function Overriding】

  • virtual: 當一個父合約的函數、modifier 或狀態變數被宣告 virtual 時,表示他在之後繼承的合約中可以被改變(覆寫)。

  • override: 當一個子合約的函數、modifier 或狀態變數被宣告 override 時,表示他正在改變(覆寫)父合約的函數。

pragma solidity ^0.8.11;

contract Base {
    function foo() virtual public {}
}

contract Middle is Base {}

contract Inherited is Middle {
    function foo() public override {}
}

Function Overriding 有以下規定和重點:

  • 在多重繼承的時候,最根本的合約需要特別宣告 override 在函數中。

  • 如果這個函數的可視性為 private 則不能是 virtual

  • 在介面中所有函數都會自動被視為 virtual

  • 可以同時override兩個父合約的函式,範例如下:

pragma solidity ^0.8.11;

contract Base1 {
    function foo() virtual public {}
}

contract Base2 {
    function foo() virtual public {}
}

contract Inherited is Base1, Base2 {
    // Derives from multiple bases defining foo(), 
    // so we must explicitly override it
    function foo() public override(Base1, Base2) {}
}

Last updated

Was this helpful?