0

当一个实例变量被继承时,在子类中改变它不会影响它在超类中的值,反之亦然。这意味着有两个实例变量。但是当我这样做时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
4

2 回答 2

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 */

  }

您的假设实际上是不正确的,您的 class中只有一个实例变量。您的函数已隐藏,为了调用它,您需要使用范围解析运算符 ( ) 直接调用它。xSubSub::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 */

  }
于 2013-10-17T17:33:06.600 回答
0

如果您只是明确使用数据成员,您应该看到问题出在哪里:

   void func() {

    this->x = 10;
    Super b;
    b.func();
    cout << "SUB" << endl;
    cout << this->x << endl;       /* prints 10 */

  }

Asthis显然不等于&b你应该清楚地看到你正在访问不同对象的成员。

于 2013-10-17T17:38:49.280 回答