C++ 最小特权原则与const关键字

C++ 最小特权原则与const关键字,c++,oop,least-privilege,C++,Oop,Least Privilege,类是关于继承和组合的。使用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) :

类是关于继承和组合的。使用
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);
} ///:~
我理解继承和组合,我也理解它们,但最小特权原则呢?有人能给我解释一下,以及如何修正我的代码,使之包含最小特权原则吗

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);
} ///:~

首先,您需要知道,最佳实践是显式地将析构函数声明为virtual,以确保在类继承树中重新调用析构函数。对于这个特定的实例,事情会起作用,但是如果您通过一个基指针删除该类,那么最终将不会调用析构函数(例如B*ptr=newc(47);delete ptr;最终将不会调用C的析构函数)

关于最小特权原则,const关键字向编译器声明在执行f()函数期间不会更改类成员

换句话说,在f()内,此参数的隐式值将是常量。您将无法更改a或B::i

常量标识符对于编译器非常有用,可以对代码进行只读优化

如果您想将代码链接到最小特权原则,您可以如下所示


“每当您重写此函数时,您将只拥有类内的读取权限”。

Const与最小权限的原则有关,因为它可以用于基于conext禁止具有副作用的函数/提供函数没有副作用的承诺。这与您的代码有什么关系我不知道…f不是重新定义,而是方法隐藏//调用~a()注释是错误的。在你的A接口中没有任何东西是虚拟的,所以如果你在这样的对象上持有一个A*指针,它就不会调用任何B或C的方法。不需要在这里声明析构函数是虚拟的<代码>~A和
~B
c
被销毁时执行。@Henrik虽然我同意你在这个特殊情况下的观点,但好的做法仍然是好的做法。如果一路上他使用了B*ptr=new C(11)呢?我不同意你的否决票,因为最佳实践甚至不是主要答案的一部分。但这是一个很好的贡献方式!答案中的第一句完全错了。如果您更新它并声明派生类的析构函数没有被调用的确切情况,我将删除downvote.Edited。谢谢你的观察。