Предупреждение компилятора Visual Studio C4250 («class1»: наследует «class2 :: member» через доминантность) - PullRequest
11 голосов
/ 22 января 2009

Следующий код генерирует предупреждение C4250. У меня вопрос, что является лучшим решением для этого?

class A
{
  virtual void func1();
}

class B : public A
{
}

class C : public A
{
  virtual void func1();
}

class D : public B, public C
{
}

int main()
{
  D d;
  d.func1(); // Causes warning
}

Согласно тому, что я прочитал, должно быть возможно сделать это:

class D : public B, public C
{
  using B::func1();
}

Но на самом деле это ничего не делает. То, как я сейчас решил это:

class D : public B, public C
{
  virtual void func1() { B::func1(); }
}

Что все думают об этом?

Ответы [ 5 ]

20 голосов
/ 01 февраля 2009

У меня было то же предупреждение для следующего кода:

class Interface
{
public:
    virtual void A() = 0;
};

class Implementation : public virtual Interface
{
public:
    virtual void A() {};
};

class ExtendedInterface : public virtual Interface
{
    virtual void B() = 0;
};

class ExtendedImplementation : public ExtendedInterface , public Implementation
{
public:
    virtual void B() {};
}; 

Этот отчет об ошибке для Visual C ++ 2005 в msdn предполагает, что это известная ошибка, которую считали недостаточно важной для исправления ... В этом случае предлагается отключить предупреждение с помощью прагмы. Я думаю, что это безопасно и в вашем случае, но вы должны использовать виртуальное наследование, как показано в ответе Гала Голдмана.

8 голосов
/ 22 января 2009

Вы пытались унаследовать публичный виртуальный класс от класса A? Я думаю, что это должно решить это.


    class B :public virtual A;
    class C :public virtual A;
    class D : public virtual B, public virtual C;

Виртуальное наследование предполагает решение неоднозначности.

1 голос
/ 04 августа 2014

[Комментарий действительно, но мне не хватает представителя ...]

Дэвид Сегондс определил это как известную ошибку в VS 2005, только что попробовал свой пример кода в VS 2008, и он показывает ту же проблему.

0 голосов
/ 30 июля 2013

Легко решить

class A
{
  virtual void func1();
}

class B : public A
{
}

class C : public A
{
  virtual void func1();
}

class D : public B, public C
{
  virtual void func1()
  {
    C::func1(); 
  }
}

int main()
{
  D d;
  d.func1(); // Causes warning
}
0 голосов
/ 22 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...