2010-10-08 29 views
0

我有一个从派生类Base派生的类Derived。在Derived的函数中,我可以访问Base的受保护成员。例如,我可以做到这一点。当从派生类访问基类成员时,强制使用范围解析运算符

class Base 
{ 
protected: 
    int i; 
} 

class Derived : class Base 
{ 
    void process() 
    { 
     i = 5; 
    } 
} 

我的问题是,是否有可能在从派生类访问基类成员时强制使用范围解析运算符?原因是我想在代码中清楚哪些变量来自基类。执法是这样,我不会意外跳过范围解决运算符(我粗心)。我更喜欢不使用访问器,因为基类中的许多成员在Derived类中是必需的,这使得代码很繁琐。我正在使用MSVC 2010。

class Base 
{ 
protected: 
    int i; 
} 

class Derived : class Base 
{ 
    void process() 
    { 
     Base::i = 5; //enforce so that i=5 won't compile 
    } 
} 
+0

为什么......你要做到这一点?如果您对保护成员不满意,请勿使用它们。 – 2010-10-08 08:00:35

+3

我建议阅读Herb Sutter的GotW关于封装的文章。总结一下:[“编写公共或受保护的数据成员从未有充分的理由”](http://www.gotw.ca/gotw/070.htm) – 2010-10-08 08:02:44

+0

这比调用保护程序更好的“文档”成员“base_i”等...? (丑陋,但这是你做的麻烦; -P)。 – 2010-10-08 08:53:47

回答

1

你不能在基类本身做它,不,你没有办法强制这样做。然而,我正在考虑一个技巧,你可以在派生类中执行你想要的操作,也就是说,如果你在派生类中声明一个具有相同名称的变量作为成员,但类型为MyBadType ,这只是一个空的类型,然后我在派生将引用它,用户可以用它做什么都没有。所以他将有资格获得基地我。但这自然是一个笑话,我的意思是,你不想增加派生类的大小来强制限定名称。你的目标本身有点可疑。

HTH, 阿尔缅

+0

如果派生类实际上有一个有效的数据成员具有相同的名称,这将无法正常工作。 – 2010-10-08 08:09:33

+0

如果派生类有一个有效的数据成员具有相同的名称,那么技巧已经完成,我的意思是,然后用户必须限定名称才能到达基础成员,对吗? – 2010-10-08 08:15:18

+0

这是对的,我没有想到通过。 – 2010-10-08 08:20:25

2

你可以通过引入另一个范围模拟它:

class Base { 
protected: 
    struct Data {int i;}; 
    Data d_Base; 
}; 

class Derived : class Base { 
    void process() { 
     d_Base.i = 5; 
    } 
}; 
相关问题