Private und geschützte virtuelle C ++ - Methode

Es scheint gut, die virtuellen Methoden privat zu machen, um die Schnittstellen für die folgenden zwei Clients zu trennen: 1. Clients, die ein Objekt instanziieren und die Methode aufrufen. 2. Clients, die von der Klasse abgeleitet sind und die Methode möglicherweise überschreiben möchten. Einfach ausgedrückt: Der erste Client muss nicht wissen, ob eine Methode virtuell ist. Er ruft die öffentliche nicht-virtuelle Methode der Basisklasse auf, die wiederum die private virtuelle Methode aufruft. Siehe folgenden Code zum Beispiel.

In dem Fall, in dem die virtuelle Methode die entsprechende virtuelle Methode ihrer Basisklasse übermitteln muss, z. B. eine Save-Methode, die alle virtuellen Methoden in der Vererbungskette durchlaufen muss, um Daten zu speichern, die den einzelnen Ebenen von entsprechen Ableitung - wir haben keine andere Möglichkeit, als eine geschützte virtuelle Methode zu verwenden - es sei denn, es gibt eine Möglichkeit, das Speichern von Daten auf allen Ableitungsebenen ohne Verwendung von Super Messaging zu gewährleisten (es gibt keine, die ich kenne).

Ich würde gerne wissen, ob die obigen Überlegungen richtig sind.

Stellen Sie sicher, dass Sie die Bildlaufleiste verwenden, um den gesamten Code anzuzeigen.

#include <iostream>
using namespace std;

class A {

    string data;    

protected:

    virtual void SaveData()= 0;

public:

    A():data("Data of A"){}

    void Save(){
        cout << data << endl;        
        SaveData();
    }
};

class B : public A {

    string data;

protected:

    virtual void SaveData() { cout << data << endl;}

public:

    B():data("Data of B") {}

};

class C : public B {

    string data;
protected:

    virtual void SaveData() {
        B::SaveData();
        cout << data << endl;
    }

public:

    C():data("Data of C") {}
};


int main(int argc, const char * argv[])
{
    C c;
    c.Save();

    return 0;
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage