Vererbung

Wie schon erwähnt, kann man eine Klasse von einer anderen Ableiten. Dadurch entsteht die Möglichkeit, die Gemeinsamkeiten verschiedener Klassen zu vereinen, und bestimmten Code nur einmal zu implementieren.
Es gibt in C++ auch für die Vererbung die Qualifier public, protected und private. Der Standard ist öffentliche Vererbung, so das alle public Elemente der Elternklasse auch public Elemente der Kindklasse sind. Bei privater Vererbung sind alle Elemente der Elternklasse privat, so dass die Kindklasse nach außen keine Schnittstellen der Elternklasse mehr hat. Die protected Vererbung werden public Elemente der Elternklasse zu protected Elementen, so dass weitere Kindklassen darauf noch  zugreifen könnten, aber die Schnittstellen nach außen nicht benutzbar sind.

Private und protected Vererbung nutzt man gerne, wenn eine Klasse ein Interface benötigt oder implementiert, dieses aber nicht nach außen weitergegeben werden soll.

Polymorphie

Auch gibt es die Möglichkeit, so verschiedene Implementierungen zu abstrahieren. So wäre eine Datenbank Klasse denkbar, welche SQLite, MySQL  und Oracle als Kindklassen hat:
class Datenbank
{
public:
    void sendQuery(const std::string& query);
    //...;
};
class SQLite : public Datenbank
{
public:
    void sendQuery(const std::string &query);
    //...;
};
class MySQL : public Datenbank
{
public:
    void sendQuery(const std::string &query);
    //...;
};
class Oracle : public Datenbank
{
public:
    void sendQuery(const std::string &query);
    //...;
};
class Artikel
{
    Datenbank* db;
    std::string name;
    int anzahl;
public:
    Artikel(Datenbank* db);
};


Hierbei gäbe es aber ein kleines Problem für die Klasse Artikel: normale Methoden sind an ihren Klassentypen gebunden, d.h. man würde immer eine konkrete Instanz bzw. einen Pointer/Referenz auf den eigentlichen Datentypen benötigen, um die dazu gehörige Methode aufzurufen. Artikel könnte dies dadurch lösen, in dem es einen dynamic_cast durchführt, damit kann man feststellen, von welcher Kindklasse eine Instanz eines Pointers auf die Elternklasse stammt:
MySQL* myDB = dynamic_cast<MySQL*>(db);

Ist db keine Instanz von MySQL, sondern von Oracle, dann ist myDB 0(NULL). Man kann also mit  vielen casts und ifs auf die korrekte Instanz testen. Muss man aber nicht :)
Denn, für einen solchen Zweck wurde das Konzept von virtuellen Methoden geschaffen. Diese können von einer Kindklasse überschrieben werden, und werden dann korrekt auch über einen Pointer oder Referenz der Elternklasse aufgerufen. Wenn eine Elternklasse eine virtuelle Methode nicht implementieren will, so kann sie diese als pure-virtual (=0) Methode anlegen, somit ist jede Kindklasse zu einer Implementation der Methode gezwungen. Für unsere Datenbankklasse ist dies sinnvoll, da erst die Kindklasse weiss, wie sie eine Query an eine Datenbank zu schicken hat:
class Datenbank
{
public:
    virtual void sendQuery(const std::string& query)=0;
    //...;
};


Diese Technik ist auch unter dem Namen Polymorphie bekannt.