2 Stimmen

konstruktor mit virtuellem funktionsaufruf in c++

Zunächst einmal unten Code ist nicht arbeiten Visual C + +, aber workin mit Blutvergießen

Die Ausgabe ist 0, aber meiner Meinung nach sollte sie 1 sein; kann mir das jemand erklären?

#include<iostream>
using namespace std;
class shape
{
public:
    virtual void print() const =0;
    virtual double area() { return 0.0;}
};
class point : public shape
{
    int x;
    int y;
public :
    point(int a=11, int b=11)
    {
        x=a;
        shape *s;
        s=this;
        cout<<s->area();
        y=b;
    }
    double area()const {return 1.0;}
    void print() const
    {
        cout<<"\nPoint\n";
        cout<<x<<"\t"<<y;
    }
};

int main()
{   
    point p(1,2);
    return 0;
}

3voto

Hans Passant Punkte 894572

Es gibt einen kleinen Fehler in Ihrem Code:

double area()const {return 1.0;}

Die Basisklasse area() Methode nicht deklariert ist const . point::area ist daher keine virtuelle Methode. Entweder deklarieren Sie shape::area const auch oder entfernen Sie const aus point::area und es wird wie erwartet funktionieren.

2voto

Naveen Punkte 71443

Der Aufruf virtueller Funktionen aus dem Konstruktor ist eine wirklich schlechte Idee. Siehe dies Aufrufen virtueller Funktionen vom Konstruktor aus (siehe 3. Absatz) für Einzelheiten.

0voto

jcoder Punkte 28716

Der Aufruf einer virtuellen Funktion im Konstruktor einer Funktion wirkt so, als ob die Funktion nicht virtuell wäre. Das kann verwirrend sein, aber es ist Standardverhalten in C++

Wenn Sie Ihr Ziel erreichen wollen, sollten Sie wahrscheinlich eine "initialise"-Funktion haben, die Sie nach dem Konstruktor aufrufen, in der virtuelle Funktionsaufrufe so funktionieren, wie Sie es erwarten.

-2voto

Prasoon Saurav Punkte 88056

Sie haben die richtige Ausgabe. Sie sollte lauten 0 . Wenn Sie anrufen area() im Konstruktor Ihrer abgeleiteten Klasse, also der Basisversion von area() anstelle der abgeleiteten Version aufgerufen wird. Der Aufruf einer virtuellen Funktion innerhalb eines Konstruktors führt nicht zum Aufruf der überschreibenden Funktionen in den abgeleiteten Klassen.

Lesen Sie dies.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X