상속 정의하는 법에 따라, 상속받은 함수를 다르게 변경할 수도 있는데,

오버라이딩, 즉 상속받은 함수를 덮어쓰기라고 생각할 수 있음

// SPDX-License-Identifier:GPL-30
pragma solidity >=0.7.0 <0.9.0;

contract Father {
    string public familyName = "Lee";
    string public givenName = "MinSang";
    uint256 public money = 100;

    constructor(string memory _givenName) {
        givenName = _givenName;
    }

    function getFamilyName() public view returns (string memory) {
        return familyName;
    }

    function getGivenName() public view returns (string memory) {
        return givenName;
    }

    function getMoney() public view returns (uint256) {
        return money;
    }
}

contract Son is Father("SeongHyun") {}

여기서 getMoney() 메서드를 오버라이딩 해보려고 합니다. Son 컨트랙트가 Father 컨트랙트에 돈 100만원을 상속 받는다고 가정할 때, Son 컨트랙트가 100만원을 저금하고, 혹은 일을 하면 월급을 또 저금함으로써 돈이 증가할 수 있기 때문입니다.

오버라이딩을 하기 위해서는 오버라이딩할 함수에 virtual을 명시해주어야 합니다.

// Father Contract

function getMoney() public view virtual returns(uint256) {
	return money;
}
// Son Contract

contract Son is Father("SeongHyun") {
	uint256 public earning = 0;

	function work() public {
		earning += 100;
	}

	function getMoney() public view override returns(256) {
		return money + earning;
	}
}

getMoney를 보면 override를 볼 수 있는데, 이를 명시함으로 우리는 함수를 오버라이딩할 수 있게 됨.

즉, 함수 안의 내용들을 마음대로 바꿀 수 있다는 뜻.

안의 내용을 보면 기존의 내용과 다른데, money + earning;으로 오버라이딩 됐음을 알 수 있음.