2017-08-15 2 views
0

ich habe folgenden Code:C++ Basis Überbrückungselement Wert

class A 
{ 
public: 
    int foo = 0; 
}; 

class B: public A 
{ 
public: 
    int foo = 1; 
}; 

int main() 
{ 
    A *a = new B(); 

    std::cout << a->foo; 
    std::getchar(); 

    return 0; 
} 

output: 0

warum B nicht das Element foo von A außer Kraft setzen?

und wie die gewünschte Leistung von 1 zu erhalten, ohne

+0

Es ist nicht zu überschreiben. Es versteckt es. Da virtuelle Felder nicht möglich sind, ist ein Überschreiben nicht möglich. Siehe https://stackoverflow.com/questions/19290796/override-member-field-in-derived-classes. Sie könnten eine Funktion verwenden. –

Antwort

1

B::foo ist ein völlig separates Element von A::foo. Aus diesem Grund wird die Initialisierung B::foo nicht aktualisiert A::foo. Sie müssten etwas mehr wie diese stattdessen tun:

class 
{ 
public: 
    int foo; 
    A(int value = 0) : foo(value) {} 
}; 

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

int main() 
{ 
    A *a = new B(); 
    std::cout << a->foo; 
    delete a; 
    std::getchar(); 
    return 0; 
} 
3

Sie können nur Überschreibungvirtual Mitglied-Funktionen abgeleiteten Klasse zu Gießen.
Alle anderen Member, seien es Funktionen, Typen oder Membervariablen, können nur shadowed sein.

Das bedeutet, dass sie überhaupt nicht geändert werden, aber nicht ohne Bezugnahme auf die richtige Basis, mit Scope-Auflösung-Operator oder dergleichen leicht zugänglich sind.

Also, ändern Sie die Verwendung von virtuellen Funktionen anstelle von Member-Variablen.

2

Verwenden Sie eine virtuelle Funktion. Sie können keine virtuellen Felder haben, daher bezieht sich der Wert, den Sie erhalten, auf den Typ Ihres Instanzzeigers (A) und nicht auf den wahren Typ dessen, auf was verwiesen wird (B).

#include <iostream> 
using namespace std; 

class A 
{ 
    int foo_ = 0; 
public: 
    virtual int foo() const { return foo_; } 
    virtual ~A(){} 
}; 

class B: public A 
{ 
    int foo_ = 1; 
public: 
    virtual int foo() const { return foo_; } 
}; 

int main() 
{ 
    A *a = new A(); 
    A *b = new B(); 

    cout << a->foo() << '\n'; 
    cout << b->foo() << '\n'; 
    cin.ignore(); 

    delete a; 
    delete b; 
} 
0

Wie Sie polymorphe Verhalten verwenden möchten, können Sie eine virtuelle Getter-Methode für die Member-Variable „foo“, da Datenelemente nicht direkt polymorph zugegriffen werden kann schreiben.

Ihr Beispielcode-Schnipsel unten modifizierte dass- zur Erreichung

class A 
{ 
    int foo; 
public: 
    A() { foo = 0; } 
    virtual int getFoo() { return foo; } 
}; 

class B: public A 
{ 
    int foo; 
public: 
    B() { foo = 1; } 
    virtual int getFoo() { return foo; } 
}; 

int main() 
{ 
    A *a = new B(); 

    std::cout << a->getFoo(); 
    std::getchar(); 

    return 0; 
} 
Verwandte Themen