Multiple inheritance lets a contract use features from more than one contract. This helps reuse code and combine abilities easily.
Multiple inheritance in Blockchain / Solidity
contract Child is Parent1, Parent2 {
// child contract code
}contract A {
function greet() public pure virtual returns (string memory) {
return "Hello from A";
}
}
contract B {
function greet() public pure virtual returns (string memory) {
return "Hello from B";
}
}
contract C is A, B {
// inherits from A and B
function greet() public pure override(A, B) returns (string memory) {
return A.greet();
}
}contract Owner {
address public owner;
constructor() {
owner = msg.sender;
}
}
contract Token {
mapping(address => uint) public balances;
}
contract MyToken is Owner, Token {
// combines ownership and token features
}This example shows multiple inheritance with contracts A and B both having a greet function. Contract C inherits both and overrides greet to use A's version.
pragma solidity ^0.8.0; contract A { function greet() public pure virtual returns (string memory) { return "Hello from A"; } } contract B { function greet() public pure virtual returns (string memory) { return "Hello from B"; } } contract C is A, B { // Override greet to specify which parent's greet to use function greet() public pure override(A, B) returns (string memory) { return A.greet(); } } contract Test { function testGreet() public returns (string memory) { C c = new C(); return c.greet(); } }
When multiple parents have the same function, you must override it in the child contract to avoid errors.
Use the override keyword to specify which parent function you want to use.
Multiple inheritance helps organize and reuse code but be careful with function name conflicts.
Multiple inheritance lets a contract use code from more than one contract.
It helps combine features and avoid code duplication.
When parents have same functions, override them in the child contract.
Practice
What is the main purpose of multiple inheritance in blockchain smart contracts?
Solution
Step 1: Understand inheritance in contracts
Inheritance allows a contract to reuse code from another contract.Step 2: Identify multiple inheritance meaning
Multiple inheritance means inheriting from more than one contract to combine features.Final Answer:
To allow a contract to use code from more than one contract -> Option BQuick Check:
Multiple inheritance = use code from multiple contracts [OK]
- Thinking multiple inheritance restricts to one contract
- Confusing inheritance with contract speed
- Believing inheritance prevents code sharing
Which of the following is the correct syntax to inherit from two contracts A and B in Solidity?
contract C is ? {}Solution
Step 1: Recall Solidity inheritance syntax
In Solidity, multiple inheritance uses commas to separate parent contracts.Step 2: Check the options
Only A, B uses commas correctly:contract C is A, B {}.Final Answer:
A, B -> Option DQuick Check:
Use commas to list parents in Solidity inheritance [OK]
- Using symbols like & or + instead of commas
- Forgetting to separate parent contracts
- Writing inheritance without any separator
Consider the following Solidity contracts:
contract A {
function greet() public pure virtual returns (string memory) {
return "Hello from A";
}
}
contract B {
function greet() public pure virtual returns (string memory) {
return "Hello from B";
}
}
contract C is A, B {
function greet() public pure override(A, B) returns (string memory) {
return super.greet();
}
}What will C().greet() return?
Solution
Step 1: Understand method resolution order
In Solidity, the order of inheritance matters. The first parent contract's function is called bysuper.Step 2: Check inheritance order and super call
Contract C inheritsAthenB. Callingsuper.greet()callsA's greet due to C3 linearization order C, A, B.Final Answer:
"Hello from A" -> Option AQuick Check:
First parent function called by super = "Hello from A" [OK]
- Assuming super calls last parent
- Expecting compilation error without override
- Thinking super calls child's own method
Given the contracts below, what is the error in contract C?
contract A {
function foo() public pure returns (string memory) {
return "A";
}
}
contract B {
function foo() public pure returns (string memory) {
return "B";
}
}
contract C is A, B {
// Missing override keyword
function foo() public pure returns (string memory) {
return super.foo();
}
}Solution
Step 1: Check function overriding rules
When overriding functions from multiple parents, Solidity requires theoverridekeyword.Step 2: Identify missing override keyword
Contract C'sfoolacksoverride(A, B), causing a compilation error.Final Answer:
Missing override keyword causes compilation error -> Option AQuick Check:
Override keyword required when overriding multiple parents [OK]
- Forgetting override keyword in child function
- Assuming super.foo() is undefined
- Thinking function visibility must be private
You have two contracts:
contract Token {
function transfer() public pure virtual returns (string memory) {
return "Token transfer";
}
}
contract Mintable {
function transfer() public pure virtual returns (string memory) {
return "Mintable transfer";
}
}
contract MyToken is Token, Mintable {
function transfer() public pure override(Token, Mintable) returns (string memory) {
return string.concat(Token.transfer(), " & ", Mintable.transfer());
}
}What will MyToken().transfer() return?
Solution
Step 1: Understand explicit calls to parent functions
MyToken'stransfercalls bothToken.transfer()andMintable.transfer()explicitly.Step 2: Check string concatenation order
The returned string concatenatesToken.transfer()first, thenMintable.transfer()with " & " in between.Final Answer:
"Token transfer & Mintable transfer" -> Option CQuick Check:
Explicit calls combine both parents' transfer strings [OK]
- Assuming super calls only one parent
- Expecting compilation error without override
- Mixing order of concatenation
Ready to prove it?
Pass the test and this pattern moves unknown
