Visual Studio Compiler-Warnung C4250 ('class1' : erbt 'class2::member' über Dominanz)
Der folgende code erzeugt Warnung C4250. Meine Frage ist, was ist die beste Lösung?
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
}
Laut dem was ich gelesen habe sollte es möglich sein, dies zu tun:
class D : public B, public C
{
using B::func1();
}
Aber das macht eigentlich nichts. Die Art und Weise hab ich momentan gelöst ist:
class D : public B, public C
{
virtual void func1() { B::func1(); }
}
Was ist jeder Blick auf dieses?
- Der code im ersten block nicht kompilieren und nachdem es geändert, um es zu kompilieren generiert wird nicht C4250.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich die gleiche Warnung für den folgenden code:
Diese bug-report für Visual C++ 2005 im msdn schlägt vor, dass dies ein bekannter bug, wurde als nicht wichtig genug, um zu beheben..., die Sie vorschlagen, um die Warnung zu deaktivieren, in diesem Fall durch die Verwendung eines pragma. Ich denke, es ist sicher auch in Ihrem Fall, aber Sie sollten verwenden Sie virtuelle Vererbung wie in der Antwort von Gal Goldman.
Haben Sie versucht, die Erben öffentlichen virtuellen Klasse A? Ich denke, es sollte, es zu lösen.
Die virtuelle Vererbung angenommen, zu lösen die Mehrdeutigkeit.
[Ein Kommentar wirklich, aber ich habe nicht genug rep...]
David Segonds identifiziert dies als einen bekannten bug in VS 2005, habe gerade versucht, seinem Beispiel-code in VS 2008 und zeigt das gleiche problem.
Ich glaube, die Lösung, die Sie verwenden, kann der Weg zu gehen, sorry zu sagen. Das einzige was ich mir vorstellen kann, dass helfen könnte, ist wenn Sie sind in der Lage, Eine ist func1 rein virtuelle. Das wäre nicht möglich in Ihrem realen Programm, obwohl.
Einfach lösen