abstrakte Basisklassen, Mehrfachvererbung und allgemeine rein virtuelle Methoden

Der folgende Testcode scheint darauf hinzudeuten, dass wenn eine Klasse zwei abstrakte Basisklassen mit gemeinsamen rein virtuellen Methoden hat, diese Methoden in der abgeleiteten Klasse "gemeinsam genutzt" werden.

#include <iostream>
#include <string>

using namespace std;

struct A
{
    virtual string do_a() const = 0;
    virtual void set_foo(int x) = 0;
    virtual int get_foo() const = 0;
    virtual ~A() {}
};

struct B
{
    virtual string do_b() const = 0;
    virtual void set_foo(int x) = 0;
    virtual int get_foo() const = 0;
    virtual ~B() {}
};

struct C : public A, public B
{
    C() : foo(0) {}
    string do_a() const { return "A"; }
    string do_b() const { return "B"; }
    void set_foo(int x) { foo = x; }
    int get_foo() const { return foo; }
    int foo;
};

int main()
{
    C c;
    A& a = c;
    B& b = c;
    c.set_foo(1);
    cout << a.do_a() << a.get_foo() << endl;
    cout << b.do_b() << b.get_foo() << endl;
    cout << c.do_a() << c.do_b() << c.get_foo() << endl;
    a.set_foo(2);
    cout << a.do_a() << a.get_foo() << endl;
    cout << b.do_b() << b.get_foo() << endl;
    cout << c.do_a() << c.do_b() << c.get_foo() << endl;
    b.set_foo(3);
    cout << a.do_a() << a.get_foo() << endl;
    cout << b.do_b() << b.get_foo() << endl;
    cout << c.do_a() << c.do_b() << c.get_foo() << endl;
}

Dieser Code kompiliert sauber in g ++ 4.1.2 (zugegebenermaßen alt) mit -std = c ++ 98 -pedantic -Wall -Wextra -Werror. Die Ausgabe ist:

A1
B1
AB1
A2
B2
AB2
A3
B3
AB3

Das wünsche ich mir, aber ich frage mich, ob das überhaupt funktioniert oder nur "durch Zufall". Grundsätzlich ist dies meine Frage: Kann ich mich auf dieses Verhalten verlassen oder sollte ich für diese Art von Szenario immer von einer virtuellen Basisklasse erben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage