覆盖C++中的继承

Luv*_*Luv 0 c++ inheritance overriding

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; }
};
Run Code Online (Sandbox Code Playgroud)

以上是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
    }
};
Run Code Online (Sandbox Code Playgroud)

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

其次,为线

X::set(ii)
Run Code Online (Sandbox Code Playgroud)

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

许多人提前感谢

Jer*_*fin 5

Y::i不会覆盖任何内容(您只能覆盖虚函数).它隐藏了 X::i,所以有两个不同的is,一个在基类中,一个在派生类中.

你的第二个问题,你只能使用类似语法之类的外面X::set(ii);set是一个static成员函数,而不是一个正常或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; }
};
Run Code Online (Sandbox Code Playgroud)

现在,既然set是虚拟的,那么呼叫main就是derived::set.由于hide不是虚拟的,因此调用main将是base::hide().问题是,i他们每个人将分配哪个班级?

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