当继承实例变量时,在子类中更改它不会影响它在超类中的值,反之亦然。这意味着有两个实例变量。但是当我执行sizeof( sublcass )
时,只会在大小中考虑一个实例变量。那么是否有为超类创建的第二个对象?
这是一个小片段来说明我在说什么:
struct Super {
int x;
void func() {
cout << "SUPERCLASS" << endl;
cout << x << endl; /* prints garbage value */
x = 4;
cout << x << endl; /* prints 4 */
}
};
struct Sub : public Super {
void func() {
x = 10;
Super b;
b.func();
cout << "SUB" << endl;
cout << x << endl; /* prints 10 */
}
};
int main() {
Sub b;
b.func();
return 0;
}
输出:
SIZE: 4
SUPERCLASS
2867344
4
SUB
10
答案 0 :(得分:0)
在此函数中,您将创建一个Super
类型的新对象并打印它。
void func() {
x = 10;
// b is now a totally different (and unrelated object)
// so calling b.func() will print the x variable that
// is valid for that instance (not this instance)
Super b;
b.func();
cout << "SUB" << endl;
cout << x << endl; /* prints 10 */
}
您的假设实际上是错误的,只有一个实例变量x
存在于您的班级Sub
中。您的函数Sub::func()
已隐藏Super::func()
,为了调用它,您需要使用范围解析运算符(::
)直接调用它。
void func() {
// this is the one (and only) x that is in scope
// inherited by `Sub` from `Super`.
x = 10;
// call Super::func(), using the scope resolution operator
Super::func();
cout << "SUB" << endl;
cout << x << endl; /* prints 10 */
}
答案 1 :(得分:0)
如果您只是明确使用数据成员,您应该看到问题所在:
void func() {
this->x = 10;
Super b;
b.func();
cout << "SUB" << endl;
cout << this->x << endl; /* prints 10 */
}
由于this
显然不等于&b
,您应该清楚地看到您正在访问不同对象的成员。