Inheritance
Overriding Methods
A derived class can provide its own version of a method from the base class.
overriding
An overriding method has the same name and compatible parameters as the base class method.
Overriding Methods
overriding_methods.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>
class Greeter {
public:
virtual std::string message(std::string name) {
return "Hello, " + name;
}
};
class ExcitedGreeter : public Greeter {
public:
std::string message(std::string name) override {
return "Hello, " + name + "!";
}
};
int main() {
std::string name = "Ada";
Greeter plain;
ExcitedGreeter excited;
std::cout << "plain=" << plain.message(name) << std::endl;
std::cout << "excited=" << excited.message(name) << std::endl;
return 0;
}
#include <iostream>
#include <string>
class Greeter {
public:
virtual std::string message(std::string name) {
return "Hello, " + name;
}
};
class ExcitedGreeter : public Greeter {
public:
std::string message(std::string name) override {
return "Hello, " + name + "!";
}
};
int main() {
std::string name = "Bjarne";
Greeter plain;
ExcitedGreeter excited;
std::cout << "plain=" << plain.message(name) << std::endl;
std::cout << "excited=" << excited.message(name) << std::endl;
return 0;
}
#include <iostream>
#include <string>
class Greeter {
public:
virtual std::string message(std::string name) {
return "Hello, " + name;
}
};
class ExcitedGreeter : public Greeter {
public:
std::string message(std::string name) override {
return "Hello, " + name + "!";
}
};
int main() {
std::string name = "Grace";
Greeter plain;
ExcitedGreeter excited;
std::cout << "plain=" << plain.message(name) << std::endl;
std::cout << "excited=" << excited.message(name) << std::endl;
return 0;
}
name ← Ada, plain ← (empty), excited ← (empty)
18int main() {19 std::string name→ Ada = "Ada"; //@name="Bjarne", "Grace"2021 Greeter plain→ (empty);22 ExcitedGreeter excited→ (empty);2324 std::cout << "plain=" << plain(empty).message(nameAda) << std::endl;25 std::cout << "excited=" << excited.message(name) << std::endl;virtual std::string message(std::string name)
5public:6 virtual std::string message(std::string nameAda) {7 return "Hello, " + nameAda;8 }std::cout << "plain=" << plain.message(name) << std::endl;
24std::cout << "plain=" << plain(empty).message(nameAda) << std::endl;25std::cout << "excited=" << excited(empty).message(nameAda) << std::endl;26return 0;outputplain=Hello, Adastd::string message(std::string name) override
12public:13 std::string message(std::string nameAda) override {14 return "Hello, " + nameAda + "!";15 }std::cout << "excited=" << excited.message(name) << std::endl;
24 std::cout << "plain=" << plain.message(name) << std::endl;25 std::cout << "excited=" << excited(empty).message(nameAda) << std::endl;26 return 0;27}outputexcited=Hello, Ada!
name ← Bjarne, plain ← (empty), excited ← (empty)
18int main() {19 std::string name→ Bjarne = "Bjarne";2021 Greeter plain→ (empty);22 ExcitedGreeter excited→ (empty);2324 std::cout << "plain=" << plain(empty).message(nameBjarne) << std::endl;25 std::cout << "excited=" << excited.message(name) << std::endl;virtual std::string message(std::string name)
5public:6 virtual std::string message(std::string nameBjarne) {7 return "Hello, " + nameBjarne;8 }std::cout << "plain=" << plain.message(name) << std::endl;
24std::cout << "plain=" << plain(empty).message(nameBjarne) << std::endl;25std::cout << "excited=" << excited(empty).message(nameBjarne) << std::endl;26return 0;outputplain=Hello, Bjarnestd::string message(std::string name) override
12public:13 std::string message(std::string nameBjarne) override {14 return "Hello, " + nameBjarne + "!";15 }std::cout << "excited=" << excited.message(name) << std::endl;
24 std::cout << "plain=" << plain.message(name) << std::endl;25 std::cout << "excited=" << excited(empty).message(nameBjarne) << std::endl;26 return 0;27}outputexcited=Hello, Bjarne!
name ← Grace, plain ← (empty), excited ← (empty)
18int main() {19 std::string name→ Grace = "Grace";2021 Greeter plain→ (empty);22 ExcitedGreeter excited→ (empty);2324 std::cout << "plain=" << plain(empty).message(nameGrace) << std::endl;25 std::cout << "excited=" << excited.message(name) << std::endl;virtual std::string message(std::string name)
5public:6 virtual std::string message(std::string nameGrace) {7 return "Hello, " + nameGrace;8 }std::cout << "plain=" << plain.message(name) << std::endl;
24std::cout << "plain=" << plain(empty).message(nameGrace) << std::endl;25std::cout << "excited=" << excited(empty).message(nameGrace) << std::endl;26return 0;outputplain=Hello, Gracestd::string message(std::string name) override
12public:13 std::string message(std::string nameGrace) override {14 return "Hello, " + nameGrace + "!";15 }std::cout << "excited=" << excited.message(name) << std::endl;
24 std::cout << "plain=" << plain.message(name) << std::endl;25 std::cout << "excited=" << excited(empty).message(nameGrace) << std::endl;26 return 0;27}outputexcited=Hello, Grace!