Переопределить виртуальную функцию базовых классов, не использующих общий интерфейс

#include <iostream>
struct B1
{
    virtual void method()=0;
    virtual ~B1(){}
};

struct B2
{
    virtual void method()=0;
    virtual ~B2(){}
};

struct D: B1, B2
{
    virtual void method()
    {
        std::cout << "D::method\n";
    };
};

int main(int argc,char *argv[])
{
    D d;
    B1 &b1=d;
    B2 &b2=d;
    b1.method();
    b2.method();
    return 0;
}

Обратите внимание, что B1 и B2 не используют общий интерфейс.

Это законно? Если да -, в каком стандарте? С++ 98/03/11?

И msvc, и gcc скомпилировали его нормально.

Раньше я думал, что должен использовать какой-то общий интерфейс для такого случая (возможного виртуального наследования ).

Есть ли у такой ситуации какое-то особое название?

Как это работает в деталях, пожалуйста? Может быть, есть ссылки на ISO?

13
задан John 12 July 2012 в 19:45
поделиться