0

假设我有一个 Base 类及其派生类 Derived,如下所示:

class Base{
    private:
        _privateVar;

    protected:
        protectedVar;

    public:
        publicVar;

    void publicMethod(someValue, anotherValue)
    {
        protectedVar = someValue;
        publicVar = anotherValue;
    }
};

class Dervied: public Base{

    protected:
        protectedVar:
};

int main(void)
{
    Dervied d;
    d.publicMethod(valueA, valueB);
}

我的问题-

当我调用d.publicMethod(...)时,Derived 中的 protectedVar 是设置还是 Base 类中的设置?

谢谢

- 一个

4

6 回答 6

5

它是Base一流的。基类不能访问派生类成员。

于 2012-06-25T16:25:21.733 回答
4

当我打电话d.publicMethod(...)时,是protectedVar在 Derived 中设置还是在 Base 类中设置?

该方法是基类的成员,因此它只能访问基类的成员。

如果该方法属于您的派生类,那么它将访问派生类成员。
因为派生类数据成员在访问它们自己的成员函数时总是隐藏基类数据成员。

于 2012-06-25T16:24:15.543 回答
1

您不能覆盖成员变量,您可以在层次结构的不同级别创建另一个具有相同名称的不同变量,但它们将是两个不相关的变量。在使用变量的上下文中,查找将找到一个或另一个,这就是将被拾取和使用的那个。

多态性只适用于virtual成员函数,不适用于非虚函数,也不适用于成员变量。

于 2012-06-25T16:53:11.023 回答
0

由于 publicMethod 是 Base 类的方法,因此设置了基类的 protectedVar。

我不知道这是否是您想要或期望的,但即使这是您想要的,我认为不建议这样做。PC-LINT 之类的工具也可能会警告您这种结构。

于 2012-06-25T16:27:04.943 回答
0

类中的成员被修改。数据成员从不表现得好像它们是虚拟的。

于 2012-06-25T16:34:05.257 回答
0

当编译器达到 的定义时Base::publicMethod,它必须静态解析它使用的所有名称。此时,这些名称的唯一可能解析是 的成员Base,因此生成的代码将访问这些成员。

以后的子类Base化不会也不可能返回并更改为Base::publicMethod. 派生类可以在不同的翻译单元中,或者在动态加载的库中。


如果您想要动态查找,请protectedVar通过受保护的虚拟访问器函数访问:这将允许派生类插入自己的变量存储。

如果Base::protectedVarDerived::protectedVar无论如何都具有相同的类型,则很难看到您期望获得什么,但它看起来像:

class Base
{
    Type protectedVarImpl;

protected:
    virtual Type & protectedVar();
    virtual Type const & protectedVar() const;

public:
    void publicMethod(someValue, anotherValue)
    {
        protectedVar() = someValue; // Note the method call
        publicVar = anotherValue;
    } 
};

Type& Base::protectedVar() { return protectedVarImpl; }
于 2012-06-25T16:36:11.303 回答