абстрактные базовые классы, множественное наследование и обычные чисто виртуальные методы

Следующий тестовый код, по-видимому, указывает, что если у класса есть два абстрактных базовых класса с общими чисто виртуальными методами, то эти методы «разделяются» в производном классе.

#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;
}

Этот код аккуратно компилируется в g ++ 4.1.2 (по общему признанию, старый) с использованием -std = c ++ 98 -pedantic -Wall -Wextra -Werror. Выход:

A1
B1
AB1
A2
B2
AB2
A3
B3
AB3

Это то, чего я хочу, но я задаюсь вопросом, работает ли это вообще или только «случайно». По сути, это мой вопрос: могу ли я зависеть от этого поведения, или я всегда должен наследовать от виртуального базового класса для этого типа сценария?

Ответы на вопрос(1)

Ваш ответ на вопрос