// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol";
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol';
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol';
contract MyNFT is ERC721URIStorage, Ownable{
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("Snake", "S"){
}
function MintNFT(address player, string memory tokenURI) public returns (uint256) {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(player, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
function NumberOfNFT() public view returns(uint){
return _tokenIds.current();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol";
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol';
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol';
contract MyNFT is ERC721("Snake", "S"),ERC721URIStorage, Ownable{
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor(){
}
function MintNFT(address player, string memory tokenURI) public returns (uint256) {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(player, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
function NumberOfNFT() public view returns(uint){
return _tokenIds.current();
}
}发布于 2022-09-16 00:40:50
在solidity中,有名为虚拟和<>重写的函数修饰符。
这意味着,当您提到一个函数是虚拟的时,您是在向编译器暗示该函数将在派生契约中被覆盖。这是编译器所期待的。
在第一个代码块中,您只导入erc721URIStorage。而ERC721URIStorage合同则是ERC721合同。
因此,当您试图在第二个代码块中两次导入ERC721契约时,它要求您使用相同的函数名覆盖虚拟函数。
如果这样做,错误将是:

如果您查看图片,错误会说:
TypeError:派生契约必须覆盖函数"_burn“。两个或多个基类定义具有相同名称和参数类型的函数。TypeError:派生契约必须覆盖函数"tokenURI“。两个或多个基类定义具有相同名称和参数类型的函数。
当您两次继承erc721契约时,您将有两个_burn和tokenURI函数。因此,在任何编程语言中都不允许有两个具有相同名称和参数的函数(编译器抛出错误),而且它们之上是虚拟函数。
告诉我是否有用!
https://ethereum.stackexchange.com/questions/135700
复制相似问题