0
0
Blockchain / Solidityprogramming~20 mins

Virtual and override keywords in Blockchain / Solidity - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Virtual and Override Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of virtual and override in Solidity inheritance
What is the output of this Solidity contract when calling test() on contract C?
Blockchain / Solidity
pragma solidity ^0.8.0;

contract A {
    function greet() public virtual pure returns (string memory) {
        return "Hello from A";
    }
}

contract B is A {
    function greet() public virtual override pure returns (string memory) {
        return "Hello from B";
    }
}

contract C is B {
    function greet() public override pure returns (string memory) {
        return "Hello from C";
    }

    function test() public pure returns (string memory) {
        return greet();
    }
}
A"Hello from C"
B"Hello from B"
C"Hello from A"
DCompilation error due to missing override
Attempts:
2 left
💡 Hint
Remember that the most derived override function is called.
Predict Output
intermediate
2:00remaining
Effect of missing override keyword in Solidity
What happens if contract B tries to override function greet() from contract A but does NOT use the override keyword?
Blockchain / Solidity
pragma solidity ^0.8.0;

contract A {
    function greet() public virtual pure returns (string memory) {
        return "Hello from A";
    }
}

contract B is A {
    function greet() public pure returns (string memory) {
        return "Hello from B";
    }
}
ARuns and returns "Hello from B"
BCompilation error due to missing override keyword
CRuns and returns "Hello from A"
DRuntime error due to function conflict
Attempts:
2 left
💡 Hint
Solidity requires explicit override keyword when overriding virtual functions.
🔧 Debug
advanced
2:00remaining
Identify the error in multiple inheritance with virtual and override
Given the following Solidity code, what is the cause of the compilation error?
Blockchain / Solidity
pragma solidity ^0.8.0;

contract A {
    function foo() public virtual pure returns (string memory) {
        return "A";
    }
}

contract B is A {
    function foo() public virtual override pure returns (string memory) {
        return "B";
    }
}

contract C is A {
    function foo() public virtual override pure returns (string memory) {
        return "C";
    }
}

contract D is B, C {
    function foo() public override pure returns (string memory) {
        return super.foo();
    }
}
ANo error, compiles successfully
BMissing override specifier in contract D's foo()
CFunction foo() must be marked virtual in contract D
DAmbiguous call to super.foo() in contract D
Attempts:
2 left
💡 Hint
Consider how Solidity resolves multiple inheritance and super calls.
📝 Syntax
advanced
2:00remaining
Correct syntax for overriding a virtual function in Solidity
Which of the following function declarations correctly overrides a virtual function bar() from a base contract?
Blockchain / Solidity
pragma solidity ^0.8.0;

contract Base {
    function bar() public virtual pure returns (string memory) {
        return "Base";
    }
}

contract Derived is Base {
    // Choose the correct override syntax for bar()
}
Afunction bar() public override virtual pure returns (string memory) { return "Derived"; }
Bfunction bar() public virtual returns (string memory) { return "Derived"; }
Cfunction bar() public override pure returns (string memory) { return "Derived"; }
Dfunction bar() public pure returns (string memory) { return "Derived"; }
Attempts:
2 left
💡 Hint
Override keyword must be present and virtual is optional if no further override is needed.
🚀 Application
expert
3:00remaining
Determine the output of complex virtual and override usage
Consider the following Solidity contracts. What is the output of calling callFoo() on contract Final?
Blockchain / Solidity
pragma solidity ^0.8.0;

contract X {
    function foo() public virtual pure returns (string memory) {
        return "X";
    }
}

contract Y is X {
    function foo() public virtual override pure returns (string memory) {
        return string(abi.encodePacked("Y", super.foo()));
    }
}

contract Z is X {
    function foo() public virtual override pure returns (string memory) {
        return string(abi.encodePacked("Z", super.foo()));
    }
}

contract Final is Y, Z {
    function foo() public override(Y, Z) pure returns (string memory) {
        return string(abi.encodePacked("Final", super.foo()));
    }

    function callFoo() public pure returns (string memory) {
        return foo();
    }
}
A"FinalZYX"
B"FinalXYZ"
C"FinalYZX"
D"FinalZX"
Attempts:
2 left
💡 Hint
Check the linearization order of inheritance and how super calls chain.