例子1:
contract owned {
funtion owned() { owner =msg.sender;} //构造函数
address owner;
}
contract mortal is owned { //mortal继承自owned
function kill() {
if(msg.sender==owner) selfdestruct(owned);
}
}
contract Base1 is mortal {
function kill() { /* do clean up 1*/ super.kill();}
}
contract Base2 is mortal {
function kill() { /* do clean up 2*/ super.kill();}
}
contract Final is Base2,Base1{
}
- Base1和Base2是mortal的派生合约
- Final是Base2和Base1的派生合约
- Final派生自两个合约(Base2和Base1),这两个父合约的顺序是有意义的,继承时会按照从左到右的顺序依次继承重写。
- 合约中的函数都是虚函数,这意味着除非指定类名,否则调用的都是最后派生的函数。
- 在例子中,Final先继承Base2,然后继承Base1,此时Base2中的kill函数将被Base1中的kill函数重写。
- 所以,Final的继承序列为Final、Base1、Base2、mortal、owned
- 当调用Final实例的kill函数时,将依次调用:Base1.kill()、Base2.kill()、mortal.kill()
- 若Base1和Base2中的super.kill()换成mortal.kill(),则调用顺序为Base1.kill()、mortal.kill()
例子2:(继承合约参数)
contract Base{
uint x;
function Base(uint _x) {x=_x;}
}
contract Derived is Base(7) {
function Derived(uint _y) Base(_y *_y) {
}
}
- 派生合约的构造函数需要提供基类合约构造函数的所有参数,有两种方法
- 第一种是上面 在继承列表中指定 is Base(7)
- 另一种是在定义派生类的构造函数时,提供 Base (_y *_y),当基本合约(基类)的构造函数参数为变量时,应当用这种方式。
- 当两种方式同时存在时,以第二种方式为准。
例子3:(抽象合约)
contract Feline{
function utterance() returns (bytes32); //抽象合约
}
contract Cat is Feline{
function utterance() returns (bytes32) {return "miaow";}
}
- Solidity允许使用抽象合约。
- 抽象合约是指一个合约只有函数声明而没有函数的具体实现,即函数的声明以“;”结束
- 只要合约中有一个函数没有具体的实现,即使合约中其他函数已实现,这一抽象合约就不能被编译。