2 Stimmen

Warum kann ich nicht auf eine öffentliche Funktion einer Basisklasse mit einem Zeiger einer Unterklasse zugreifen?

Ich bin nicht sicher, warum ich einen "Fehler C2660: 'SubClass::Data' : Funktion nimmt nicht 2 Argumente".

Ich habe eine Basisklasse mit einer Funktion namens data. Die Funktion benötigt ein Argument. Es gibt eine Überladung von Data, die 2 Argumente benötigt. In meiner Unterklasse überschreibe ich die data-Funktion mit 1 Argument. Wenn ich nun versuche, die Überladung von Data von einem Zeiger auf subClass aufzurufen, erhalte ich den oben genannten Kompilierfehler.

class Base : public CDocument
{
Public:
virtual CString&    Data( UINT index);      
CString     Data( UINT index, int pos); 
};
class SubClass : public Base
{
Public:
virtual CString&    Data( UINT index);      

};

Void SomeOtherFunction()
{
subType* test = new subType();
test->Data( 1, 1);// will not compile
((Base*)test)->Data(1,1); // compiles with fine.
}

9voto

Greg Bacon Punkte 127209

Die Programmiersprache C++ von Bjarne Stroustrup ( p. 392, 2. Aufl.):

15.2.2 Vererbung und Verwendungserklärungen
Überlastauflösung wird nicht über verschiedene Klassenbereiche hinweg angewendet (§7.4)

Sie können sie mit einem qualifizierten Namen aufrufen:

void SomeOtherFunction()
{
  SubClass* test = new SubClass();

  test->Base::Data(1, 1);
}

oder durch Hinzufügen einer using-Deklaration zu SubClass :

class SubClass : public Base
{
  public:
  using Base::Data;
  virtual CString& Data( UINT index);
};

void SomeOtherFunction()
{
  SubClass* test = new SubClass();

  test->Data(1, 1);
}

3voto

quamrana Punkte 32950

Ihre Überschreibung von Data(UINT index) in SubClass die Überladung in der Basisklasse "versteckt".

Eine Lösung besteht darin, SubClass wie folgt zu kodieren:

class SubClass : public Base
{
public:
using Base::Data;    // <--- brings all the overloads into scope
virtual CString&    Data( UINT index);          
};

Jetzt test->Data(1,1) sollte funktionieren.

1voto

Nikola Smiljanić Punkte 26439

Sie müssen die Verwendung von Base::Data in Ihrer SubClass hinzufügen

Sehen Sie sich Punkt 33 an: Vermeiden Sie das Verstecken von geerbten Namen von Effective C++

1voto

Adrian McCarthy Punkte 42872

Es ist die Versteckregel Sie versuchen, Sie vor sich selbst zu schützen.

0voto

jasonline Punkte 7978

Wenn Sie die in der Basisklasse deklarierte Funktion außer Kraft setzen, werden alle anderen Funktionen mit diesem Namen in der Unterklasse ausgeblendet. Wie bereits erwähnt, müssen Sie diese Namen durch die using Base::Data-Deklaration in den Geltungsbereich der Unterklasse bringen.

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