3

私が最初のクラスを持っているとしましょう

class Walker {
public:
   Walker();
   virtual ~Walker();
   virtual void Step();
};

次に、前者から派生した2番目のもの

class Mecha : public Walker {
public:
   Mecha();
   virtual ~Mecha();
private:
   virtual void Step();
};

そのprivate修飾子はStep()役に立ちますか?Mecha::Step()としてまだ呼び出すことができWalker::Step()ますね。サブクラスの定義を通じてスーパークラスの性質を変更しようとしているときに、警告が表示されるべきではありませんか?

4

2 に答える 2

3

いいえ、作成してもポリモーフィックな動作は変わりStep() privateません。言語がこれを明示的に許可しているため、警告はありません。(ただし、Java はそうではないことに注意してください)。

ただし、のメンバー関数でコーディングしない限り、明示的書き込むことができなくなります。Mecha::Step()Mecha

于 2016-08-12T11:27:46.263 に答える
3

サブクラスは仮想メソッドの可視性に影響を与えますか?

はい、メソッドの可視性を変更できます。

そのprivate修飾子はStep()役に立ちますか?

依存します。主にコードのクライアントに影響します。

可視性を高める (たとえば からprotectedに移動するpublic) ことは有用ですが、その使用に関する警告が伴います。基本クラス インターフェイスの実装者は、そのメソッドを階層の内部にすることを望んでいたため、外部にすると問題が発生する可能性があります... (テンプレートメソッドパターンの実装が思い浮かびます)。

基本的に、可視性を変更しても、メソッドのポリモーフィックな性質には影響しませんvirtual。派生クラスでオーバーライドされます。ただし、呼び出し元には影響します。メソッドを変更して、privateクライアント コードを、派生クラスではなく基本クラスへのポインタまたは参照からメソッドを呼び出すように制限します。

Mecha m;
//m.Step(); // fails to compile
Walker& w = m;
w.Step(); // still calls Mecha::Step()

さらに、メソッドを に変更するprotectedと、さらにサブクラスがそれを呼び出すことができます。

于 2016-08-12T11:37:30.767 に答える