次の2つのクライアントのインターフェイスを分離するために仮想メソッドをプライベートにするのは良いことのようです-1。オブジェクトをインスタンス化してメソッドを呼び出すクライアント2.クラスから派生し、メソッドをオーバーライドする可能性のあるクライアント。簡単に言えば、最初のクライアントはメソッドが仮想であるかどうかを知る必要はありません。彼は基本クラスのパブリック非仮想メソッドを呼び出し、次にプライベート仮想メソッドを呼び出します。たとえば、以下のコードを参照してください。
ここで、仮想メソッドが、たとえばSaveメソッドなどの基本クラスの対応する仮想メソッドにスーパーメッセージを送信する必要がある場合、各レベルに対応するデータを保存するには、継承のチェーン内のすべての仮想メソッドを通過する必要があります。派生-スーパーメッセージングを使用せずに派生のすべてのレベルでデータの保存を保証する方法がない限り、保護された仮想メソッドを使用する以外に選択肢はありません(私が知っているものはありません)。
上記の理由が正しいかどうか知りたいのですが。
コード全体を表示するには、必ずスクロールを使用してください。
#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;
}