2016-05-23 17 views
1

Ich habe die Methode f() in der Klasse A und die untergeordnete Klasse B, wo ich die Methode f(int) hinzufüge. Also ich habe sowohl f() als auch f(int) in B wenn ich das richtig verstehe. Ich möchte f() in einer anderen Methode von B verwenden, aber es ist ein Fehler.Hinzufügen einer Methode zu einer untergeordneten Klasse mit dem Namen einer geerbten Methode

class A { 
public: 
    int f() { 
     return 3; 
    } 
}; 

class B : public A { 
    int x; 
public: 
    int f(int a) { 
     return a * 2; 
    } 
    void g() { 
     x = f(); 
     // no matching function for call to 'B::f()' 
     // candidate is 'int B::f(int)' 
    } 
}; 

Wenn ich f(int) von B entfernen wird es funktionieren.

Antwort

5

So habe ich sowohl f() und f(int) in B wenn ich mich recht verstehen.

Nein, A::f() ist im Bereich B versteckt. Da die Elementfunktion mit dem Namen f im Bereich der Klasse B gefunden werden kann und die Namenssuche beendet wird, wird die Basisklassenversion f nicht gefunden und für die Überladungsauflösung berücksichtigt. Zum Schluss ist die Kompilierung fehlgeschlagen, weil der Parameter functioin nicht übereinstimmt. Es ist eine Art Namen, der sich versteckt.

Sie können A::f über using eingeben.

class B : public A { 
    int x; 
public: 
    using A::f; 
    int f(int a) { 
     return a * 2; 
    } 
    void g() { 
     x = f(); 
    } 
}; 

Wenn ich f(int) von B entfernen wird es funktionieren.

Dann wird die Namenssuche im Rahmen der Klasse B, die weitere Bereiche geprüft werden fehlgeschlagen und A::f wird am Umfang der Basisklasse A, dann funktioniert es gut finden.

Siehe Unqualified name lookup

1

Sie können Bereichsauflösungsoperator ::

ersetzen x = f(); mit x = A::f();

class A { 
public: 
    int f() { 
     return 3; 
    } 
}; 

class B : public A { 
    int x; 
public: 
    int f(int a) { 
     return a * 2; 
    } 
    void g() { 
     x = A::f(); 
    } 
}; 
verwenden
Verwandte Themen