{"content":{"title":"solidity - 继承（Inheritance）","body":"继承（Inheritance）\r\n---\r\n1.合约之间的继承使用关键字 is\r\n2.父合约的方法想被子合约继承则需要使用关键virtual\r\n3.子合约想覆盖父合约的方法则需要使用关键字override\r\n4.在子合约中调用父合约需要使用关键字super\r\n5.继承遵循最远继承，后面继承的会覆盖前面的方法\r\n\r\n```\r\ncontract A {\r\n    event Log(string message);\r\n\r\n    function foo() public virtual {\r\n        emit Log(\"A.foo called\");\r\n    }\r\n\r\n    function bar() public virtual {\r\n        emit Log(\"A.bar called\");\r\n    }\r\n}\r\n\r\ncontract B is A {\r\n    function foo() public virtual override {\r\n        emit Log(\"B.foo called\");\r\n        A.foo();\r\n    }\r\n\r\n    function bar() public virtual override {\r\n        emit Log(\"B.bar called\");\r\n        super.bar();\r\n    }\r\n}\r\n\r\ncontract C is A {\r\n    function foo() public virtual override {\r\n        emit Log(\"C.foo called\");\r\n        A.foo();\r\n    }\r\n\r\n    function bar() public virtual override {\r\n        emit Log(\"C.bar called\");\r\n        super.bar();\r\n    }\r\n}\r\n\r\ncontract D is B, C {\r\n    function foo() public override(B, C) {\r\n        super.foo();\r\n    }\r\n\r\n    function bar() public override(B, C) {\r\n        super.bar();\r\n    }\r\n}\r\n\r\n```\r\n- 调用foo的时候，由于B，C中的foo都没有使用super，所以只是覆盖问题，根据最远继承，C 覆盖了B，所以执行顺序为：D -> C -> A\r\n- 调用bar的时候，由于B，C中的bar使用了super，此时D的两个parent都需要执行一遍，因此为D-> C -> B -> A"},"author":{"user":"https://learnblockchain.cn/people/5348","address":null},"history":null,"timestamp":1668076051,"version":1}