典型地,“使用”声明用于纳入范围,否则将被隐藏的基类的一些成员函数。从这个角度来看,只有制作获取的信息更方便使用的机制。结果 但是:在“使用”声明也可用于改变访问约束(不仅为功能,而且还对属性)。例如:

class C{
public:
  int a;
  void g(){ cout << "C:g()\n"; }
  C() : a(0){}
};

class D : public C{
private:
  using C::a;
  using C::g;
public:
  D() { a = 1; }
};

int main(void){
  D d;
  cout << d.a << endl;  //error: a is inaccessible
  C *cp = &d;
  cout << cp->a << endl; //works
  d.g();  //error: g is inaccessible
  cp->g();  //works
  return 0;
}

我认为在派生类访问的这个限制实际上没有用的是,因为可以始终从一个指针访问克()和一个基类。所以should't有至少某种编译器警告呢?否则也不会被它甚至更好的派生类禁止人们进入这样的限制吗? using声明是不添加约束访问的唯一的可能性。它也可以通过重写基类功能的将其放置在与多个存取约束的部分完成的。 是否有一些合理的例子,其中的确是nessecary来限制这样的访问?如果不是我不明白为什么它应该被允许。

和另一件事:至少使用g ++相同的代码编译良好,没有“使用”字。这意味着对于上面的例子:它可能写C ::一个;和C ::克;代替用C ::一个;用C ::克;是第一只一个快捷方式后,还是有一些细微的差别?

//编辑:结果 所以从讨论和回答以下我的结论是:点击 - 这是允许的限制在派生类公共继承访问限制结果 - 有些情况下它可以用来搜索有用的例子 - 它的使用可能会结合导致问题的模板(例如派生类中不能对一些模板类的有效参数/功能更多,虽然它的基地)点击 - 更清洁的语言设计不应该允许这样的使用结果 - 编译器至少可以发出某种警告

有帮助吗?

解决方案

对于你的声明没有using:这些被称为“访问声明”,并已被弃用。下面是从标准的文本,从11.3/1

  

基类的一个成员的访问可以在派生类通过在提其合格-ID被改变   派生类的声明。这样的提及称为访问声明。接入声明的效果的 qualified-id ;被定义为等同于声明using qualified-id ; [脚注:访问声明被弃用;构件的使用-声明(7.3.3)提供做同样的事情的更好的手段。在早期版本的C ++语言,访问声明是比较有限的;他们被广义和作出等同于使用-声明 - 端脚注]

我会说,最常见是不好的公共的成员改变的私人的或保护的成员在派生类中,因为这会违反替换原则:你知道一个基类有一定的功能,如果你投来,然后派生类,你的期望的这些功能可以被调用过,因为派生类的是-A 的碱。而像你已经提到的,这种不变的是反正已经通过允许转换(其中隐含的工作!)的基类引用,或修饰函数的名称,然后调用(当时公众)函数的语言执行。

如果你想禁止有人喊了一组基本的功能,那么我认为这暗示了遏制(或在极少数情况下,私有继承)是一个更好的主意。

其他提示

虽然使用声明你表明确实提供了一个机构来改变访问级别(但仅向下),这不是在这样的上下文中的主使用它。 A,使用上下文有主要是为了允许访问,否则将被从基类由于语言力学遮蔽功能。 E.g。

class A {
public:
   void A();
   void B();
};

class B {
public:
   using A::B;
   void B(int); //This would shadow A::B if not for a using declaration
};

声明

using C::a

带来的“一”到本地命名范围,以便以后可以用“一”来参考,以“C ::一”;因为这,“C :: a”和“一个”只要不声明与名称“A”的局部变量是可互换的。

声明不改变的访问权限;您可以访问“一”中的子类,只是因为“a”是不是私人的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top