【问题标题】:Enforce use of scope resolution operator when accessing base class member from derived class从派生类访问基类成员时强制使用范围解析运算符
【发布时间】:2010-10-08 07:58:03
【问题描述】:

我有一个派生自类 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
    }
}

【问题讨论】:

  • 为什么...你想这样做?如果您对受保护的成员不满意,请不要使用它们。
  • 我建议阅读 Herb Sutter 关于封装的 GotW 文章。总结一下:"there is never a good reason to write public or protected data members"
  • 这会比调用受保护成员“base_i”等更好的“文档”吗? (丑陋,但这是你弄的一团糟;-P)。
  • @James:我认为 Spock 可能会一般地询问成员。虽然他的示例是关于成员数据,但我阅读它的方式同样适用于成员函数
  • 你们有一点关于它的有用性。最后我发现这样做毕竟不是真的有用。认为我实际上关心的是从派生类中的成员变量中识别局部变量,我认为使用不同的命名样式会有所帮助。无论如何,感谢cmets

标签: c++ visual-studio


【解决方案1】:

你可以通过引入另一个作用域来模拟它:

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

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

【讨论】:

    【解决方案2】:

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

    HTH, 阿门

    【讨论】:

    • 如果派生类实际上有一个有效的同名数据成员,这将不起作用。
    • 如果派生类确实有一个具有相同名称的有效数据成员,那么技巧已经完成,我的意思是用户必须限定名称才能获得基成员,对吧?
    • 小提示:回复评论时使用@username,这样被寻址的用户会收到通知。
    猜你喜欢
    • 2011-06-11
    • 2011-01-27
    • 1970-01-01
    • 2016-07-31
    • 2021-12-05
    • 2017-09-30
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多