##まずはコードを見てみる
百聞は一見に如かずということで、まずは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];
}
}
ご覧の通り、本題であるvirtual
とoverride
が入っています。
では、それぞれの意味と使い方を解説します。
##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忘れてない?」と言われます)
overrideを追加します。
function balanceOf(address owner) public view override returns (uint256) {
require(owner != msg.sender);
uint256 a =2;
return a;
}
するとエラーが解消されます。このように関数が上書き後のものだと明示するのがoverrideです。
そして詳細は省きますが、継承元のERC721.solのvirtual
を削除するとこれまたエラーが発生します。(virtual忘れてない?と言われる)
気になる方は実際に試してみて下さい。
##おわりに
以上、備忘録を兼ねたメモです。もし間違い等見つけた場合はコメント等でご指摘お願いします。