【问题标题】:prevent changing access levels of inherited protected members防止更改继承的受保护成员的访问级别
【发布时间】:2012-07-03 10:17:20
【问题描述】:

有没有办法阻止某人更改继承的受保护成员的访问级别? 有人可以在派生类中使用using 声明,并将继承的受保护成员的访问级别提高到公共。

现在的问题是如何防止这种情况发生?

示例:

#include <iostream>
using namespace std;

class A {
 protected:
   int i(){};
 };

class B : public A {
 public:
   using A::i;
};

int main() {
  B b;
  b.i();
  return 0;
}

如何预防

#include <iostream>
using namespace std;

class A {
 private:
   void i(int) {};
 protected:
   int i(){};
 };

class B : public A {
 public:
   using A::i;
};

int main() {
  B b;
  b.i();
  return 0;
}

【问题讨论】:

  • 每个人都可以正常访问受保护的字段,那么您为什么还要这样做呢?
  • 如果每个人都可以访问它们,那么它们为什么存在?
  • @hamed:它们的存在是为了防止意外违反封装。没有办法防止像这样的故意违规,即使你想这样做,所以仅仅阻止最直接的方法是没有意义的。
  • @hamed 您的“如何预防”部分是错误的。您不能有两个同名的成员 A::iA::i()。即使没有using A::i...
  • 你是对的,这只能与成员函数一起使用

标签: c++ oop


【解决方案1】:

你不能。即使您可以阻止 using 指令,派生类仍然可以简单地公开一个新的公共字段,该字段是受保护成员的指针或引用,或者返回此类指针或引用的公共成员函数。

【讨论】:

  • 最后我发现如果我定义了一个名为i的伪私有方法,那么派生类就不能使用using A::i;
  • @hamed 您的class A 在“如何预防”示例中没有class B 将无法编译事件...您不能有两个同名的成员...跨度>
  • class B : public A { public: void i() { A::i(); } }; 如您所见 - 在方法的情况下 - 您可以在不使用 using 的情况下进行推广 ...
猜你喜欢
  • 1970-01-01
  • 2018-01-18
  • 2023-03-23
  • 2011-05-24
  • 2016-06-12
  • 2014-06-09
  • 2013-03-20
  • 2017-09-26
  • 2018-09-15
相关资源
最近更新 更多