假设我有一个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类中的protectedVar?
由于
- 甲
答案 0 :(得分:5)
属于Base
级。基类无法访问派生类成员。
答案 1 :(得分:4)
当我致电
d.publicMethod(...)
时,Derived中的protectedVar
是否已设置或基类中的{{1}}
该方法是Base类的成员,因此它只能访问Base类的成员。
如果该方法属于您的Derived类,那么它将访问Derived类成员 因为Derived类数据成员在自己的成员函数中访问时总是隐藏基类数据成员。
答案 2 :(得分:1)
您不能覆盖成员变量,您可以在层次结构中具有相同名称的不同级别创建另一个不同的变量,但它们将是两个不相关的变量。在变量的 use 的上下文中,lookup将找到一个或另一个,这是将被拾取和使用的那个。
多态性仅适用于virtual
成员函数,不适用于非虚函数,也不适用于成员变量。
答案 3 :(得分:0)
由于publicMethod是Base类的methoc,因此设置了基类的protectedVar。
我不知道这是你想要的还是期望的,但即使这是你想要的,我认为不建议这样做。像PC-LINT这样的工具可能也会警告你这样的结构。
答案 4 :(得分:0)
base 类中的成员已修改。数据成员从不表现为虚拟。
答案 5 :(得分:0)
当编译器达到Base::publicMethod
的定义时,它必须静态解析它使用的所有名称。此时,这些名称的唯一可能解析是Base
的成员,因此生成的代码将访问这些成员。
稍后对Base
进行子类化不会,也不可能返回并更改为Base::publicMethod
生成的代码。派生类可以位于不同的翻译单元中,也可以位于动态加载的库中。
如果您想要动态查找,请通过受保护的虚拟访问器函数访问protectedVar
:这将允许派生类为变量插入自己的存储。
如果Base::protectedVar
和Derived::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; }