C++: mit einer Basis-Klasse als Implementierung einer Schnittstelle
In C++ ist es möglich, die Verwendung einer anderen Basis-Klasse, die Umsetzung einer Schnittstelle (d.h. abstrakte Basis-Klasse) in eine abgeleitete Klasse?
class Base
{
virtual void myfunction() {/*...*/};
}
class Interface
{
virtual void myfunction() = 0;
}
class Derived
: public Base, public Interface
{
//myfunction is implemented by base
}
Den oben genannten stellen, aber nicht wirklich arbeiten. Gibt es eine Möglichkeit, um diesen Effekt zu erzielen?
Falls es jemanden interessiert, der Grund für den Wunsch ist, dass es Sinn machen (für meine Anwendung) verwenden eine generische Bibliothek von einem anderen Projekt/namespace um die Implementierung einer Schnittstelle in meinem Projekt. Könnte ich einfach wickeln alles, aber das scheint wie eine Menge von zusätzlichen Aufwand.
Dank.
- vielleicht, wenn
Base
geerbt vonInterface
... - +1 für klare Frage
Interface
undDerived
gehören zum ProgrammBase
gehört in die Bibliothek. Es gibt viele Fälle, wo man hin möchte, nicht zu haben, gemeinsame Schnittstellen mit der Bibliothek - nur die Wiederverwendung der Implementierung zu unterstützen, die anwendungsspezifische Schnittstellen. Feature von ObjC (und Reihe von anderen Sprachen), aber nicht in C++.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn
Base
ist nicht abgeleitet vonInterface
, dann müssen Sie haben die Weiterleitung von Gesprächen inDerived
. Es ist nur - "overhead" in dem Sinne, dass müssen Sie zusätzlichen code schreiben. Ich vermute, dass der optimizer damit es so effizient, als wenn Sie Ihre ursprüngliche Idee gearbeitet hatte.Versuchen Sie dies:
Nicht. (nicht, dass sowieso Weg)
Könnten Sie in die Irre führen lassen durch die Art und Weise, die Dinge tun, die in anderen Sprachen wie Java, C#, ActionScript, etc.
In C++, multiple Vererbung und die Art und Weise virtuelle Klassen verwaltet werden, macht Schnittstellen (wie in anderen Sprachen) obsolet. In diesen anderen Sprachen, Schnittstellen werden verwendet, um die Probleme beheben, die aus der fehlenden Mehrfachvererbung (gut oder schlecht, es ist eine Wahl).
Also, wenn das, was Sie tun möchten ist, geben Sie einfach eine Allgemeine Schnittstelle mit einige virtuelle Methoden, die Bereitstellung von Standard-Implementierungen, nur die Implementierung in der Basisklasse :
Wenn Sie jedoch möchten, um mehrere Basisklassen, die die gleichen Schnittstellen haben, dann denken Sie, dass Ihre interface-Klasse wird die Grundlagen der anderen Klassen
Es ist jedoch ein nicht-wirklich-einfach-zu-Lesen - (read: nicht empfohlen) Weg, um eine default-Implementierung, SONDERN zwingt den Benutzer explizit sagen, ob er es nutzen will oder nicht. Sie nutzen die Tatsache, dass auch Reine virtuelle Funktionen können default-Implementierungen aufgerufen werden kann :
Aber tun Sie es nicht.
Basis und Schnittstelle sind völlig unterschiedliche Typen. Wie ist der compiler wissen kann, dass "myfunction" ist im Zusammenhang? Sie müssen implementieren Sie in den Abgeleiteten, auch wenn die Umsetzung nur Aufrufe der Basis-version.
Die Antwort ist unter der Annahme, dass die abgeleitete Klasse sein will
CONCRETE
Klasse oder eine nicht abstrakte Klasse, ich.e es gewünscht ist, in der Lage sein, um Objekte zu instanziieren der Typ'Derived'.
. Auch ich nehme an öffentliche member-Funktionen in meiner Antwort.Nicht. Die abgeleitete Klasse implementieren muss alle rein virtuellen Funktionen, die es erbt von allen Basisklassen. In diesem Fall
'Base::myfunction'
obwohl vererbt'Derived'
wird nicht behandelt, wie eine Implementierung von'Derived::myfunction'
'Derived::myfunction'
noch eine Implementierung von'Interface::myfunction'.
Eine Möglichkeit kann sein, dass
'Derived::myfunction'
können intern delegieren zu'Base::myfunction'
Aber wenn es nicht gewünscht
Derived
zu einer konkreten Klasse (was ich bezweifle, ist die Absicht des OP), dann ist die obige Anordnung der Klassen ist in Ordnung (der Sprache, Perspektive)