【发布时间】:2011-01-06 06:54:53
【问题描述】:
'using' 声明通常用于将基类的一些成员函数引入范围,否则这些成员函数将被隐藏。从这个角度来看,它只是一种使可访问信息更方便使用的机制。
但是:'using' 声明也可用于更改访问约束(不仅适用于函数,还适用于属性)。例如:
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;
}
我认为派生类中的这种访问限制实际上是没有用的,因为您始终可以从指向基类的指针访问 g() 和 a。那么至少不应该有某种编译器警告吗?或者禁止派生类对访问的这种限制不是更好吗? using 声明不是添加访问约束的唯一可能性。也可以通过覆盖基类的函数并将其放置在具有更多访问约束的部分中来完成。 是否有一些合理的例子表明以这种方式限制访问确实是必要的?如果不是,我不明白为什么应该允许它。
还有一件事:至少对于 g++,相同的代码在没有“使用”这个词的情况下也能很好地编译。这意味着对于上面的示例:可以编写 C::a;和 C::g;而不是使用 C::a;使用 C::g;第一个只是后者的捷径还是有一些细微的差别?
//编辑:
所以从下面的讨论和答案中,我的结论是:
- 允许使用公共继承限制派生类中的访问约束
- 有一些有用的例子可以使用它
- 它的使用可能会导致与模板组合出现问题(例如,派生类不再是某些模板类/函数的有效参数,尽管它是基础)
- 更简洁的语言设计不应该允许这样的使用
- 编译器至少可以发出某种警告
【问题讨论】:
标签: c++ scope access-control using-declaration