0
class X {

  int i;

public:

  X() { i = 0; }

  void set(int ii) { i = ii; }

  int read() const { return i; }

  int permute() { return i = i * 47; }
};

以上是X类的定义

另一个 Y 类是

class Y : public X {

    int i; // Different from X's i

public:

    Y() { i = 0; }

    int change() {
        i = permute(); // Different name call
        return i;
    }

    void set(int ii) {
        i = ii;
        X::set(ii); // Same-name function call
    }
};

我怀疑X类也包含一个名为i的变量,它被Y类继承,但是Y类的i应该覆盖它,但是类(Y)的大小是8。

其次,对于线路

X::set(ii)

我们可以这样调用函数吗?是否为任何对象调用了 X 类的这个函数?

非常感谢提前

4

2 回答 2

5

Y::i不覆盖任何东西(你只能覆盖一个虚函数)。它隐藏 X::i了,所以有两个不同i的,一个在基类中,一个在派生类中。

对于第二个问题,在类之外,您只能使用诸如X::set(ii);whensetstatic成员函数的语法,而不是普通函数或virtual成员函数。在类内部,您可以使用它来强制使用特定类的成员函数定义。

编辑:我可能应该回答棘手的(有些相关的)问题:如果静态类型与动态类型不同,i使用哪个?例如,让我们考虑一个简化版本:

class base { 
protected:  // we'll make `i` protected, so `derived` can access it if necessary.
    int i;
public:
    base() : i(0) {}
    void hide() { i = 2; }
    virtual void set() { i = 10; }
};

class derived : public base { 
    int i;
public:
    derived() : i(0) {}
    void hide() { i = 1; }
    void set() { i = 5; }
};

现在,因为set是虚拟的,所以调用main是 to derived::set。由于hide不是虚拟的,因此调用main将是 to base::hide()i问题是,他们每个人将分配到哪个班级?

答案很简单:即使函数是虚拟的,变量也不是,所以每个函数都引用自己类中的变量。拥有/缺少virtual控制您调用哪个函数,但不控制该函数引用哪个变量。

于 2012-06-14T03:11:37.137 回答
4

请注意,您的代码中没有覆盖,只有 name hidden

我怀疑X类也包含一个名为i的变量,它被Y类继承,但是Y类的i应该覆盖它,但是类(Y)的大小是8。

继承不会覆盖变量。iin classY将隐藏 class 的名称i,但X两者都会存在,因此大小为8

X::set(ii) 我们可以这样调用函数吗?是否为任何对象调用了 X 类的这个函数?

在类Y中,这个限定的调用请求以静态方式调用setfrom而不是of 。XsetY

于 2012-06-14T03:11:22.927 回答