【问题标题】:Data corruption in protected access in c++C ++中受保护访问中的数据损坏
【发布时间】:2010-10-04 13:21:00
【问题描述】:

“受保护”的变量容易被派生类恶意更改? 我应该在基类变量中使用“private”而不是“protected”吗?

【问题讨论】:

    标签: c++ private protected


    【解决方案1】:

    如果您担心“恶意”修改,那么即使将数据标记为 private: 也无济于事。

    C++ 访问说明符仅对本质上遵守规则的代码有用。

    将成员标记为private 将防止您班级的普通用户与他们混淆。然而,即使是有错误的非恶意代码也可能破坏这些成员。溢出、错误的指针算法或不当使用强制类型转换会让 C++ 程序员导致这些问题。

    【讨论】:

      【解决方案2】:

      嗯,protected 成员确实会被继承。如果您不希望这种情况发生,请将它们设为私有

      【讨论】:

        【解决方案3】:

        在 C++ 中无法阻止“恶意”访问,因为您总能以某种方式绕过编译器限制。如果您担心“意外”更改,请继续将其设为私有。

        【讨论】:

          【解决方案4】:

          【讨论】:

            【解决方案5】:

            一般来说,如果你打算声明一个私有变量,你应该退后一步,问问自己为什么还要在头文件中发布声明?

            而不是在 foo.h 中向全世界公开您的成员变量:

            class foo {
            private:
                int    please_dont_modify_me;
                double pretend_you_dont_see_this_declaration;
                char   dont_look_at_this [128];
            public:
                ....
            };
            

            只使用一个不完整的私有类型,即没有定义:

            class foo {
                struct foo_privates & mine;   // incomplete type
            public:
                ...
            };
            

            然后在 foo.cpp

            struct foo_privates {
                 int    i;
                 double d;
                 char   str[128];
            }; 
            

            当然,foo 的构造函数必须分配单独的对象,而析构函数必须销毁它。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-06-14
              • 1970-01-01
              • 2012-06-05
              • 2012-01-12
              • 1970-01-01
              • 2017-09-21
              • 2012-05-26
              • 1970-01-01
              相关资源
              最近更新 更多