0

クラスは継承と構成に関するものです。const最小権限の原則に関連するキーワードを使用していますか?

私は継承と構成を理解し、それらを理解していますが、最小特権の原則はどうですか? 誰かが私にそれを説明し、私のコードを最小特権の原則を含むように修正する方法を説明できますか?

class A {
  int i;
public:
  A(int ii) : i(ii) {}
  ~A() {}
  void f() const {}
};

class B {
  int i;
public:
  B(int ii) : i(ii) {}
  ~B() {}
  void f() const {}
};

class C : public B {
  A a;
public:
  C(int ii) : B(ii), a(ii) {}
  ~C() {} // Calls ~A() and ~B()
  void f() const {  // Redefinition
    a.f();
    B::f();
  }
};

int main() {
  C c(47);
} ///:~
4

1 に答える 1

0

まず、デストラクタがクラス継承ツリー内で再帰的に呼び出されることを保証するために、デストラクタを virtual として明示的に宣言することがベスト プラクティスであることを知っておく必要があります。この特定のインスタンスでは問題はありませんが、ベース ポインターを介してクラスを削除すると、デストラクタが呼び出されないことになります (たとえば、B* ptr = new C(47); delete ptr; C で終了します)。デストラクタが呼び出されていない)。

最小特権の原則に関して、const キーワードは、f() 関数の実行中にクラス メンバーの変更が行われないことをコンパイラに示します。

つまり、 f() 内では、暗黙の this パラメータは定数になります。a または B::i を変更することはできません。

const 識別子は、コードに対して読み取り専用の最適化を行うために、コンパイラにとって非常に役立ちます。

コードを最小特権の原則にリンクする場合は、次のように記述できます。

「この関数をオーバーライドするときはいつでも、クラス内の読み取り権限しかありません」。

于 2014-12-16T07:29:14.623 に答える