2016-05-30 11 views
0

Ich verstehe wirklich nicht, warum das so funktioniert.Warum funktioniert das so?

#include<iostream> 

using namespace std; 
class Figura{ 
public: 
int x; 
int y; 
virtual void pomak(int dx=10,int dy=1) 
    { 

     x+=dx; 
     y+=dy; 
     cout<<"Figura"<<endl; 


    } 
}; 
class Skakac:public Figura{ 
public: 
void pomak(int dx=2,int dy=-1) 
    { 
     cout<<dx<<endl; 
     x+=dx; 
     y+=dy; 
     cout<<"Skakac"<<endl; 


    } 
}; 

int main() 
{ 
    Skakac S; 
    S.x=0; 
    S.y=0; 
    Figura* x=&S; 
    cout<<x->x<<" "<<x->y<<endl; 
    x->pomak(); 
    cout<<S.x<<" "<<S.y<<endl; 




} 

Wenn i Funktion Pomak() aufrufen, es Couts dx als 10, obwohl es zweite Funktion Pomak nennt (nicht die virtuellen) und ich klar gesagt, dass dx = 2.

+0

Ändern der Standardwerte in überschriebenen virtuellen Funktionen ... bitte nicht :( – Borgleader

+1

Kannst du nicht mit einem besseren Titel kommen? Man fängt an zu denken, dass es um das ist this ptr. – user2672165

Antwort

2

Gemäß der Norm (N4140):

8.3.6 Standard-Argumente
...
Ein virtueller Funktionsaufruf (10.3) verwendet die defa UT Argumente in der Deklaration der virtuellen Funktion durch den statischen Typ des Zeigers oder Verweis auf das Objekt bestimmt. Eine überschreibende Funktion in einer abgeleiteten Klasse erhält keine Standardargumente von der Funktion, die sie überschreibt. [  Beispiel:

struct A { 
    virtual void f(int a = 7); 
}; 
struct B : public A { 
    void f(int a); 
}; 
void m() { 
    B* pb = new B; 
    A* pa = pb; 
    pa->f(); // OK, calls pa->B::f(7) 
    pb->f(); // error: wrong number of arguments for B::f() 
} 

-End Beispiel]

+0

Wie kann ich es beheben? Ich möchte Standardwerte in virtuellen und übergeordneten Funktionen haben –

+0

Nicht sicher, ob es ist eine gute Idee, aber Sie können eine virtuelle Funktion 'getDefaults (int & dx. int & dy)' machen und sie nach Bedarf überschreiben. – AlexD

+0

Was haben Sie? Und damit? Kannst du Code für mich eingeben –

1

die Funktion über einen Zeiger auf Figura genannt wird. Der Standardwert für das Argument ist klar 10.

Da die Funktion virtuell ist, wird die abgeleitete Version der Funktion verwendet wird, basiert auf dem dynamischen Typ des spitzen Gegenstand, der Skakac ist. Die Standardargumente des dynamischen Typs werden nicht als der Standard verwendet, der bereits von AlexD zitiert wurde.

P.S.

es nennt zweite Funktion Pomak (nicht die virtuellen)

Skakac::pomak ist auch virtuell.

Wie kann ich es beheben?

Wenn von „Fix it“ Sie bedeuten, „Wie kann ich das Standardargument außer Kraft setzen“, dann anstelle von Standard-Argumente, die ich empfehlen die Verwendung von Überlastung:

class Figura { 
    // ... 
    virtual void pomak() { 
     pomak(10, 1); 
    } 
    virtual void pomak(int dx, int dy) { 
     // ... 
    } 
}; 
class Skakac: public Figura { 
    // ... 
    void pomak() { 
     pomak(2, -1); 
    } 
    void pomak(int dx, int dy) { 
     // ... 
    } 
}; 
+0

Wie kann ich das beheben?Ich möchte Standardwerte in virtuellen und übergeordneten Funktionen haben –

+0

@rusherzythaman siehe die Bearbeitung. – user2079303

+0

@ user2079303 In diesem Fall könnte es ziemlich verwirrend sein, sowohl 'pomak()' als auch 'pomak (int, int)' virtual ... – AlexD