2016-04-26 14 views
0

Jedesmal, wenn ich es immer für Basisklasse namens Draw-Methode aufrufen ...virtuelle Funktion nicht funktioniert

#pragma once 
    #include <pch.h> 

    class A 
    { 
    public: 
     A(); 

     virtual void Draw(CanvasDrawingSession^ drawingSession); 
    }; 

Klasse B von A abgeleitet

#pragma once 
#include <pch.h> 
#include <A.h> 

class B: public A 
{ 
public: 
    B(); 

    void Draw(CanvasDrawingSession^ drawingSession); 
}; 

Wenn ich Basisklasse Objekt mit abgeleiteten Klasse Objekt initialisieren A a = B() und Aufruf Draw-Methode - a. Draw() wird immer Draw() von der Basisklasse aufrufen. Was mache ich falsch?

+3

'A a = B()' macht * Objekt-Slicing * und konvertiert im Wesentlichen Ihre 'B' -Instanz in eine' A' -Instanz. Polymorphismus in C++ funktioniert durch * Zeiger * und * Referenzen * auf Basisklassen. –

Antwort

2

Der Code A a = B() eine Instanz des Typs B-Konstrukte, und ordnet sie dann in eine Variable vom Typ A. Der Compiler für Sie

A::A(const A&) 
ein Standard Copykonstruktor ... erzeugt hat

... die für die Zuweisung aus einer Variablen vom Typ B funktioniert, weil jede Instanz von B eine Instanz des Typs A ist (weil es eine Unterklasse von A ist). Dieser Effekt ist als object slicing bekannt.

Damit Ihr Code funktioniert, werfen Sie die B -ness nicht weg. Sie könnten dies zum Beispiel tun:

B the_b = B(); 
A* a_ptr = &the_b; 
a_ptr->Draw() 

Der B::Draw() nennen.

+0

Jetzt bekomme ich "Lesezugriffsverletzung" A war nullptr –

+0

Das ist der Grund, warum mein Beispiel '' 'a_ptr''' mit' '' 'A * a_ptr = &the_b;' '' 'initialisiert. –

Verwandte Themen