LoginSignup
2
1

More than 1 year has passed since last update.

【solidity】virtualとoverrideの使い方

Posted at

まずはコードを見てみる

百聞は一見に如かずということで、まずはopenzeppelinのERC721.solのコードを見てみましょう。
下は、balanseOf(略)という関数です。※途中省略してるので元のリンクを貼っておきます
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

//途中はところどころ省略してます
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {

    mapping(address => uint256) private _balances;

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }
}

ご覧の通り、本題であるvirtualoverrideが入っています。
では、それぞれの意味と使い方を解説します。

virtualとoverrideの意味と使い方

virtual:"この関数は上書きしていいですよー"という意味
override:"この関数は上書きした後の関数ですよー"という意味

使い方を確認するために実際にコードを書いてみます。
まずはERC721.solを継承したコードを適当に書いてください。継承後のファイルで、先ほどの関数balanceOf()を作成することで上書き=overrideします。
virtualとoverrideは消して作成します。関数の中身は適当に変えてもらってOKです。

function balanceOf(address owner) public view returns (uint256) {
    require(owner != msg.sender);
    uint256 a =2;
    return a;
}

すると、overrideが無いので、以下のようにエラーになります。
(「override忘れてない?」と言われます)
vo.png

overrideを追加します。

function balanceOf(address owner) public view override returns (uint256) {
    require(owner != msg.sender);
    uint256 a =2;
    return a;
}

するとエラーが解消されます。このように関数が上書き後のものだと明示するのがoverrideです。
そして詳細は省きますが、継承元のERC721.solのvirtualを削除するとこれまたエラーが発生します。(virtual忘れてない?と言われる)
気になる方は実際に試してみて下さい。

おわりに

以上、備忘録を兼ねたメモです。もし間違い等見つけた場合はコメント等でご指摘お願いします。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1