Наследование по доминированию - это действительно плохо?

Я один из тех людей, которым нужно заставить свой код компилироваться с помощью 0 предупреждений. Обычно я уважаю компилятор, и если он выдает предупреждение, я воспринимаю это как знак того, что мне следует немного подправить свой код. Если мне приходится сказать компилятору игнорировать данное предупреждение, я немного дергаюсь.

Но это, кажется, я не могу обойти, и, насколько я могу судить, я не сделал ничего «плохого». Кто-нибудь думает, что это плохой дизайн? Я не вижу в нем ничего особенно неприятного (кроме «злого алмаза»), но это совершенно правильный и полезный код. Но он генерирует (в MSVC) предупреждение уровня 2!

class IFoo
{
public:
    virtual void foo() = 0;
};

class Bar : public virtual IFoo
{
public:
    virtual void foo() { std::cout << "Hello, world!"; }
};

class Baz : public virtual IFoo
{

};

class Quux : public Bar, public Baz
{

};

Теперь, если я создаю объект Quux, следует ожидать вызова реализации Bar :: foo. MSVC очень полезен: он предупреждает меня о недостаточной двусмысленности?

предупреждение C4250: 'Quux': наследует 'Bar :: Bar :: foo' через доминирование

Теперь я понимаю, что могу отключить это предупреждение с помощью pragma, но я не пытаюсь здесь задать этот вопрос. Есть ли причина, по которой я должен слушать компилятор здесь, или это просто чрезмерно усердное предупреждение?

19
задан Shirik 15 August 2011 в 22:44
поделиться