Virtuelle Funktion Standardparameter und Überladung

Diese Frage bezieht sich auf häufig auftretende Probleme, die in den folgenden Fragen behandelt werden:

Können virtuelle Funktionen Standardparameter haben?

Standardparameter für virtuelle Funktionen

Folgendes passiert derzeit in c ++ mit Standardparametern für virtuelle Funktionen:

struct Base
{
    virtual void foo(int one = 1, int two = 2)
            { cout << "one: " << one << " two: " << two << endl; }
};

struct Derived : public Base
{
    virtual void foo(int one = 3, int two = 4) 
        { Base::foo(one, two); cout << " derived!" << endl; }
};

int main()
{
    Base* b = new Base();
    Base* d = new Derived();

    Derived* dp = new Derived();

   b->foo();
   d->foo();
   dp->foo();

   return 0;
}

Ausgabe:

one: 1 two: 2
one: 1 two: 2
 derived!
one: 3 two: 4
 derived!

Dies ist das Verhalten, das ich mir in den Standardparametern der virtuellen C ++ - Funktion gewünscht habe:

#include <iostream>

using namespace std;

struct Base
{
    virtual void foo () { foo(1, 2); }
    virtual void foo (int one) { foo(one, 2); }
    virtual void foo(int one, int two)
            { cout << "one: " << one << " two: " << two << endl; }
};

struct Derived : public Base
{   
    virtual void foo() { foo(3, 4); }
    virtual void foo(int one, int two) 
        { Base::foo(one, two); cout << " derived!" << endl; }
};

int main()
{
    Base* b = new Base();
    Base* d = new Derived();

    Derived* dp = new Derived();

   b->foo();
   d->foo();
   dp->foo();

   return 0;
}

Ausgabe:

one: 1 two: 2
one: 3 two: 4
 derived!
one: 3 two: 4
 derived!

Wenn ich also einen Standardparameter in einer übergeordneten Klasse überschreiben möchte, erstelle ich einfach ein neues foo mit dieser Anzahl von Argumenten. Beachten Sie, dass die abgeleitete Bedingung die No-Arg-Bedingung überschreibt, nicht jedoch die One-Arg-Bedingung. Nebenbei bemerkt, mein aktuelles Projekt verwendet eine rein virtuelle Basisklasse. Ich habe oft Zeiger des Basisklassentyps und des abgeleiteten Klassentyps. Ich möchte, dass ein Aufruf von beiden Zeigern das gleiche Ergebnis liefert.

FRAGEN:

Ich habe viele Fragen zu diesem Thema gelesen, aber sie scheinen keine vernünftigen Lösungen zu bieten. Die meisten Lösungen würden im gesamten Projekt zu hässlichem Code führen.

Einige sagen "Verwenden Sie keine Standardparameter für virtuelle Funktionen", aber dann müsste ich den Standard an jeder Stelle setzen, an der ich die Funktion aufrufe. Es scheint besser zu sein, nur einen Kommentar zu schreiben, der besagt: "Ändere auch die Basisklasse" und "Ändere auch die abgeleitete Klasse", als überall ändern zu müssen, wo die Funktion aufgerufen wird.

Einige geben an, nur die Standardparameter in der Basisklasse zu haben. Dies bedeutet jedoch, dass jeder Zeiger auf ein abgeleitetes Objekt auf einen Basiszeiger zurückgesetzt werden muss, bevor die Standardwerte verwendet werden können. Das macht auch viel Code hässlich.

Gibt es Gründe, warum ich das obige Design vermeiden sollte?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage