Schlüsselwort virtual;
-
Hallo,
Ich hab ne kurze frage. Was bringt der Schlüsselwort virtual?
Ich hab vieles drüber gelesen mein Hirn wills aber irgendwie
nicht verstehen.Danke
Grüsse !
-
#include <iostream> struct OhneVirtualBase { void print() { std::cout << "OhneVirtualBase"; } }; struct OhneVirtualDerived : public OhneVirtualBase { void print() { std::cout << "OhneVirtualDerived"; } }; struct MitVirtualBase { virtual void print() { std::cout << "MitVirtualBase"; } }; struct MitVirtualDerived : public MitVirtualBase { virtual void print() { std::cout << "MitVirtualDerived"; } }; int main() { OhneVirtualBase* base1 = new OhneVirtualDerived; base1->print(); // Huch, wieso meldet sich Base? Haben wir doch überschrieben. MitVirtualBase* base2 = new MitVirtualDerived; base2->print(); // Wie erwartet MitVirtualDerived }
-
Was können wir anderes schreiben als das was in Büchern steht? Was genau verstehst du nicht? Fehlen dir Hintergrundkenntnisse zum Verständnis?
-
"Mit virtual an einer Methodendeklaration wird der Rechner beauftragt, beim Aufruf diese Methode nicht unmittelbar anzuspringen, sondern zunächst jedesmal das konkrete Objekt zu befragen, welche Methode denn nun wirklich zu benutzen sei."
Was meint er z.B hier mit anzuspringen
Quelle :
http://frag.wikia.com/wiki/Was_bedeutet_das_Schlüsselwort_virtual_in_der_Programmiersprache_C%2B%2B
-
@ethon hm... in deinem Code hast du eine entscheidende Kleinigkeit vergessen: die Vererbung
-
daddy_felix schrieb:
@ethon hm... in deinem Code hast du eine entscheidende Kleinigkeit vergessen: die Vererbung
Danke
"Mit virtual an einer Methodendeklaration wird der Rechner beauftragt, beim Aufruf diese Methode nicht unmittelbar anzuspringen, sondern zunächst jedesmal das konkrete Objekt zu befragen, welche Methode denn nun wirklich zu benutzen sei."
Was meint er z.B hier mit anzuspringen
Quelle :
http://frag.wikia.com/wiki/Was_bedeutet_das_Schlüsselwort_virtual_in_der_Programmiersprache_C%2B%2BMeinen Code mal ausprobiert? Nichts über das du dich wunderst?
-
Ja ausprobiert hab ichs ,dass hab ich aber auch erst gemerkt
als er es gesagt hat.
-
Ja also bei nicht virtual wirds nicht überschrieben.
-
Das ist eine sehr formale Definition, die ich einem Anfänger so üblicherweise nicht geben würde. Es bedeutet einfach, dass beim Aufruf einer Methode über eine Referenz/einen Zeiger auf die Basisklasse der Typ betrachtet wird, den das Objekt in Wirklichkeit hat.
Kleines Beispiel:
struct base { void foo() { std::cout << "base::foo\n"; } virtual void bar() { std::cout << "base::bar\n"; } }; struct derived { void foo() { std::cout << "derived::foo\n"; } void bar() { std::cout << "derived::bar\n"; } }; int main() { derived d; base& b = d; // Ganz normal wie erwartet d.foo(); // Ausgabe: derived::foo d.bar(); // Ausgabe: derived::bar b.foo(); // Ausgabe: base::foo b.bar(); // Aha! Ausgabe: derived::bar }
-
Ja also bei nicht virtual wirds nicht überschrieben.
-
Aso damit kann ich dann einen Object auf die Methoden eines anderen Objectes zugreifen lassen. Wenn natürlich die Methode dann virtual ist
-
Cho++ schrieb:
Aso damit kann ich dann einen Object auf die Methoden eines anderen Objectes zugreifen lassen. Wenn natürlich die Methode dann virtual ist
Kann mal einer übersetzen
- Hat eine Klasse min. eine
virtual function
, verhält sie sich polymorph.
- Einenon-virtual function
kann nicht überschrieben, sondern nur verdeckt werden.
- Hat eine Klasse min. einepure virtual function
, nennt sie sich abstrakte Basisklasse.
-
Gugelmoser schrieb:
abstrakte Klasse.
Sag: abstrakte Basisklasse. Denn wenn du schon keine Instanzen erstellen kannst, willst du ja ableiten, oder etwa nicht?
P.S.: Seit C++11 gibt es noch das schöne Schlüsselwörtchen
final
. Google das mal.Edit: Ach, und nochwas:
#include <iostream> struct base { virtual void bar() { std::cout << "base::bar\n"; } }; struct derived : public base { void bar() { std::cout << "derived::bar\n"; } }; int main() { derived d; base& binst = d; binst.bar(); binst.base::bar(); }
-
Hacker schrieb:
Gugelmoser schrieb:
Sag: abstrakte Basisklasse. Denn wenn du schon keine Instanzen erstellen kannst, willst du ja ableiten, oder etwa nicht?
Stimmt. Es war auch mal davon die Rede (ich glaube
pumuckl
wars), dass abstrakte Klassen ausschließlich als Basisklassen vorkommen sollten.
-
Wo ist final?
[quote:923f93410a="Working Draft, Standard for Programming
Language C++ / N3242=11-0012 / Page 24 "]alignas continue friend register true
alignof decltype goto reinterpret_cast try
asm default if return typedef
auto delete inline short typeid
bool double int signed typename
break do long sizeof union
case dynamic_cast mutable static unsigned
catch else namespace static_assert using
char enum new static_cast virtual
char16_t explicit noexcept struct void
char32_t export nullptr switch volatile
class extern operator template wchar_t
const false private this while
constexpr float protected thread_local
const_cast for public throw
-
Zeus schrieb:
Wo ist final?
Wikipedia schrieb:
Note that neither override nor final are language keywords. They are technically identifiers; they gain special meaning only when used in those specific contexts. In any other location, they can be valid identifiers.
-
Zeus schrieb:
Wo ist final?
Da hat er sogar Recht, Kapitel 10.3
-
Ahh, tut mir Leid. Jedenfalls kann man sie benutzen.
-
SeppJ schrieb:
Zeus schrieb:
Wo ist final?
Da hat er sogar Recht, Kapitel 10.3
Seltsam im ersten Augenblick - aber ich seh doch richtig, dass das final nur in Bezug auf die Funktion spezifiziert werden kann und nicht auf die Klasse?
-
Zeus schrieb:
Seltsam im ersten Augenblick - aber ich seh doch richtig, dass das final nur in Bezug auf die Funktion spezifiziert werden kann und nicht auf die Klasse?
Ja.