Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从派生类访问基类成员时强制使用范围解析运算符_C++_Visual Studio - Fatal编程技术网

C++ 从派生类访问基类成员时强制使用范围解析运算符

C++ 从派生类访问基类成员时强制使用范围解析运算符,c++,visual-studio,C++,Visual Studio,我有一个从类基类派生的类。在派生函数中,我可以访问Base的受保护成员。例如,我能做到这一点 class Base { protected: int i; } class Derived : class Base { void process() { i = 5; } } 我的问题是,在从派生类访问基类成员时,是否可以强制使用范围解析运算符?原因是我想在代码中明确哪些变量来自基类。强制执行是为了我不会意外跳过范围解析操作符(我很粗心)。我不喜欢

我有一个从类基类派生的类。在派生函数中,我可以访问Base的受保护成员。例如,我能做到这一点

class Base
{
protected:
    int i;
}

class Derived : class Base
{
    void process()
    {
        i = 5;
    }
}
我的问题是,在从派生类访问基类成员时,是否可以强制使用范围解析运算符?原因是我想在代码中明确哪些变量来自基类。强制执行是为了我不会意外跳过范围解析操作符(我很粗心)。我不喜欢使用访问器,因为派生类中需要来自基类的许多成员,这使得编写代码非常繁琐。顺便说一下,我正在使用MSVC2010

class Base
{
protected:
    int i;
}

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

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

嗯,,
Armen

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

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

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

为什么。。。你想那样做吗?如果您对受保护的成员不满意,请不要使用它们。我建议您阅读Herb Sutter关于封装的GotW文章。总结一下:这比称受保护的成员为“base_i”等更好吗。。。?(难看,但这是你的乱七八糟;-P)。@詹姆斯:我想斯波克可能会问一下一般的会员。虽然他的例子是关于成员数据的,但从我的理解来看,这个问题同样适用于成员函数。最后,我发现这样做根本没有什么用处。我实际上关心的是从派生类中的成员变量中识别局部变量,我认为使用不同的命名样式会有所帮助。无论如何,感谢您的评论如果派生类实际上有一个同名的有效数据成员,那么这将不起作用。如果派生类确实有一个同名的有效数据成员,那么技巧已经完成了,我的意思是,用户必须限定名称才能访问基成员,对吗?一点提示:当回复评论时,使用
@username
,这样地址用户就会收到通知。