Überlast der rein virtuelle Funktion
Normalerweise verwende ich Reine virtuelle Funktionen für die Methoden, die erforderlich sind, meinen code auch zu funktionieren. Daher erstelle ich interfaces und dann anderen Benutzern der Umsetzung Ihrer abgeleiteten Klassen. Die abgeleiteten Klassen haben nur diese virtuellen Funktionen als der öffentlichkeit, während einige zusätzliche Methoden implementiert werden sollten als privat, da mein code nicht nennen.
Ich weiß nicht, ob diese berücksichtigt werden können als good-practice-OOP (gibt es design-pattern?).
Trotzdem, meine Frage ist:
Kann ein Benutzer überlastung eine rein virtuelle Funktion?
d.h.
class Base
{
public:
Base();
virtual ~Base();
virtual void foo(int,double)=0;
};
class Derived:
public Base
{
private:
//methods
public:
Derived();
virtual ~Derived();
virtual void foo(int, double, double); //this doesn't work
};
Könnte eine Lösung sein:
virtual void foo(int,double,double=0)=0;
in der Basisklasse, aber es ist sehr begrenzt. Was denkt Ihr darüber?
Nicht deinem Beispiel fehlt
class Derived : Base
?richtig, ich habe nur bearbeitet. Dank
InformationsquelleAutor Ale | 2013-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese 2 Funktionen sind Verschieden. Letzteres ist nicht zu überschreiben die erste
Das zweite ist, neue virtuelle spezifische Funktion abgeleitet.
Wenn Sie eine
override
am Ende der Kompilierung wird sich beschweren, dass Sie nicht zu überschreiben nichts. Das ist c++11 prüfen obwohl.Kann der Benutzer überschreiben, eine rein virtuelle Funktion, um zu bestätigen, verwenden Sie
override
am Ende der Funktion zu überprüfen. In Ihrem Fall die zweite Funktion kann nur zugegriffen werden, die mit Abgeleiteten Zeiger oder Typ. (obwohl es nicht instanziiert werden kann, es sei denn, die rein virtuelle Funktion ist ordnungsgemäß außer Kraft gesetzt und umgesetzt werden, bis dahin ist es eine abstrakte Klasse). Daher, wenn es nicht sein soll überschrieben werden weitere Klassen abgeleitet ausDerived
dann macht es virtuellen ist ein overhead, jedenfalls ist es nicht overidding der Basis-Methode.override
wenn diese Antwort auftauchte. So, hier geht zumindest der link: msdn.microsoft.com/en-us/library/vstudio/jj678987.aspxwarum in dem Beispiel, Erstens funcC(double =0.0) Getriebe funktioniert, während der zweite code funktioniert es nicht?
Ich habe es gerade ausprobiert und es scheint, dass die
override
Schlüsselwort im ersten Beispiel ist redundant, wenn man die Kommentare in Betracht ziehen.InformationsquelleAutor Abhijit Kadam
Können Sie nicht.
Angenommen, Sie haben eine
Base
Zeiger, der auf einenDerived
Objekt. Mit derBase
Zeiger, Sie haben "Zugriff" nur dieBase
's interface (es sei denn, Sie Stimmen zuDerived
Zeiger, aber das ist nicht das, was Sie brauchen).Ich don ' T get your point. Was ist der Unterschied zwischen
interface
undabstract class
in c++?linkeine abgeleitete Klasse könnte mehr Funktionen haben als der abstrakten Klasse. Statt eine Schnittstelle begrenzt die Anzahl der Methoden (meiner Meinung nach).
InformationsquelleAutor Kiril Kirov
Einer überladenen Funktion ist lediglich eine Funktion mit dem gleichen Namen wie eine andere, aber akzeptieren, einen anderen Satz von Parametern, d.h. es ist eine verschiedenen Funktion. Es hat nichts damit zu tun, ob eine oder mehrere überladene Funktionen virtuell ist oder nicht.
In dem Beispiel, das Sie präsentiert, ich glaube, dass ein Benutzer überlasten könnte die rein-virtuelle Funktion, aber nur nach dem überladen. Und Sie konnte nicht auf die Funktion aus der Basisklasse direkt - Sie müssten Besetzung der Basisklasse Zeiger auf die abgeleitete Klasse Zeiger.
InformationsquelleAutor maditya
Als von anderen darauf hingewiesen wird, es will einfach nicht funktionieren.
Mehr diskret, hier ist, was passiert,
InformationsquelleAutor Arun
Es ist nicht zu überschreiben, da die Funktion Signaturen unterschiedlich sind. Nach den Polymorphismus der Regel zu überschreiben einer Funktion die Funktion Signaturen und Typen sollten identisch sein.
In diesem Fall, sind diese Funktionen unterschiedlich sind.
virtual void foo(int,double)=0;
virtual void foo(int, double, double);
InformationsquelleAutor abhijitsinha_17
Nicht überladen foo in der base-Klasse ist die einfachste Lösung?
InformationsquelleAutor Christopher Ackler