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

name
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;
}
  1. 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;
  2. virtual std::string message(std::string name)

    5public:6    virtual std::string message(std::string nameAda) {7        return "Hello, " + nameAda;8    }
  3. 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, Ada
  4. std::string message(std::string name) override

    12public:13    std::string message(std::string nameAda) override {14        return "Hello, " + nameAda + "!";15    }
  5. 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!
  1. 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;
  2. virtual std::string message(std::string name)

    5public:6    virtual std::string message(std::string nameBjarne) {7        return "Hello, " + nameBjarne;8    }
  3. 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, Bjarne
  4. std::string message(std::string name) override

    12public:13    std::string message(std::string nameBjarne) override {14        return "Hello, " + nameBjarne + "!";15    }
  5. 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!
  1. 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;
  2. virtual std::string message(std::string name)

    5public:6    virtual std::string message(std::string nameGrace) {7        return "Hello, " + nameGrace;8    }
  3. 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, Grace
  4. std::string message(std::string name) override

    12public:13    std::string message(std::string nameGrace) override {14        return "Hello, " + nameGrace + "!";15    }
  5. 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!