Virtual functions let a base pointer call the derived class implementation.

Virtual Functions

virtual_functions.cpp
#include <iostream>
#include <string>

class Shape {
public:
    virtual int measure() {
        return 0;
    }

    virtual std::string name() {
        return "shape";
    }
};

class Square : public Shape {
private:
    int side;

public:
    Square(int size) {
        side = size;
    }

    int measure() override {
        return side * side;
    }

    std::string name() override {
        return "square";
    }
};

class Line : public Shape {
private:
    int length;

public:
    Line(int size) {
        length = size;
    }

    int measure() override {
        return length;
    }

    std::string name() override {
        return "line";
    }
};

int main() {
    bool useSquare = ;
    int size = ;

    Square square(size);
    Line line(size);
    Shape* shape = &line;

    if (useSquare) {
        shape = &square;
    }

    std::cout << "shape=" << shape->name() << std::endl;
    std::cout << "measure=" << shape->measure() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

class Shape {
public:
    virtual int measure() {
        return 0;
    }

    virtual std::string name() {
        return "shape";
    }
};

class Square : public Shape {
private:
    int side;

public:
    Square(int size) {
        side = size;
    }

    int measure() override {
        return side * side;
    }

    std::string name() override {
        return "square";
    }
};

class Line : public Shape {
private:
    int length;

public:
    Line(int size) {
        length = size;
    }

    int measure() override {
        return length;
    }

    std::string name() override {
        return "line";
    }
};

int main() {
    bool useSquare = ;
    int size = ;

    Square square(size);
    Line line(size);
    Shape* shape = &line;

    if (useSquare) {
        shape = &square;
    }

    std::cout << "shape=" << shape->name() << std::endl;
    std::cout << "measure=" << shape->measure() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

class Shape {
public:
    virtual int measure() {
        return 0;
    }

    virtual std::string name() {
        return "shape";
    }
};

class Square : public Shape {
private:
    int side;

public:
    Square(int size) {
        side = size;
    }

    int measure() override {
        return side * side;
    }

    std::string name() override {
        return "square";
    }
};

class Line : public Shape {
private:
    int length;

public:
    Line(int size) {
        length = size;
    }

    int measure() override {
        return length;
    }

    std::string name() override {
        return "line";
    }
};

int main() {
    bool useSquare = ;
    int size = ;

    Square square(size);
    Line line(size);
    Shape* shape = &line;

    if (useSquare) {
        shape = &square;
    }

    std::cout << "shape=" << shape->name() << std::endl;
    std::cout << "measure=" << shape->measure() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

class Shape {
public:
    virtual int measure() {
        return 0;
    }

    virtual std::string name() {
        return "shape";
    }
};

class Square : public Shape {
private:
    int side;

public:
    Square(int size) {
        side = size;
    }

    int measure() override {
        return side * side;
    }

    std::string name() override {
        return "square";
    }
};

class Line : public Shape {
private:
    int length;

public:
    Line(int size) {
        length = size;
    }

    int measure() override {
        return length;
    }

    std::string name() override {
        return "line";
    }
};

int main() {
    bool useSquare = ;
    int size = ;

    Square square(size);
    Line line(size);
    Shape* shape = &line;

    if (useSquare) {
        shape = &square;
    }

    std::cout << "shape=" << shape->name() << std::endl;
    std::cout << "measure=" << shape->measure() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

class Shape {
public:
    virtual int measure() {
        return 0;
    }

    virtual std::string name() {
        return "shape";
    }
};

class Square : public Shape {
private:
    int side;

public:
    Square(int size) {
        side = size;
    }

    int measure() override {
        return side * side;
    }

    std::string name() override {
        return "square";
    }
};

class Line : public Shape {
private:
    int length;

public:
    Line(int size) {
        length = size;
    }

    int measure() override {
        return length;
    }

    std::string name() override {
        return "line";
    }
};

int main() {
    bool useSquare = ;
    int size = ;

    Square square(size);
    Line line(size);
    Shape* shape = &line;

    if (useSquare) {
        shape = &square;
    }

    std::cout << "shape=" << shape->name() << std::endl;
    std::cout << "measure=" << shape->measure() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

class Shape {
public:
    virtual int measure() {
        return 0;
    }

    virtual std::string name() {
        return "shape";
    }
};

class Square : public Shape {
private:
    int side;

public:
    Square(int size) {
        side = size;
    }

    int measure() override {
        return side * side;
    }

    std::string name() override {
        return "square";
    }
};

class Line : public Shape {
private:
    int length;

public:
    Line(int size) {
        length = size;
    }

    int measure() override {
        return length;
    }

    std::string name() override {
        return "line";
    }
};

int main() {
    bool useSquare = ;
    int size = ;

    Square square(size);
    Line line(size);
    Shape* shape = &line;

    if (useSquare) {
        shape = &square;
    }

    std::cout << "shape=" << shape->name() << std::endl;
    std::cout << "measure=" << shape->measure() << std::endl;
    return 0;
}
virtual A `virtual` function can dispatch through a base pointer or reference at runtime.