LINUX.ORG.RU

История изменений

Исправление dearAmomynous, (текущая версия) :

Наличием таблицы виртуальных методов (Если таковые имеются)/Полиморфизмом.

class Foo {
public:
    virtual void do_something() const = 0;
    virtual ~Foo() = default;
};

class Bar : public Foo {
public:
    virtual void do_something() const override {
         printf("Quack!");
    }
}

class Baz : public Foo {
private:
    int m_some_number;

public:
    virtual void do_something() const override {
        printf("I contain this number: %d", this->m_some_number); 
    }
}

void make_it_do_something(const Foo *foo) {
    if(foo != nullptr)
        foo->do_something();
}

int main() {
    Foo * bar = new Bar();
    Foo * baz = new Baz();
    delete baz;
    delete bar;
}

А то что ты называешь наследованием - это агрегация/композиция, а не наследование.

Исходная версия Deleted, :

Наличием таблицы виртуальных методов (Если таковые имеются)/Полиморфизмом.

class Foo {
public:
    virtual void do_something() const = 0;
};

class Bar : public Foo {
public:
    virtual void do_something() const override {
         printf("Quack!");
    }
}

class Baz : public Foo {
private:
    int m_some_number;

public:
    virtual void do_something() const override {
        printf("I contain this number: %d", this->m_some_number); 
    }
}

void make_it_do_something(const Foo *foo) {
    if(foo != nullptr)
        foo->do_something();
}

int main() {
    Foo * bar = new Bar();
    Foo * baz = new Baz();
    delete baz;
    delete bar;
}

А то что ты называешь наследованием - это агрегация/композиция, а не наследование.