c++ - 在 C++ 中重写继承

标签 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; }
};

上面是类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 类的这个函数?

非常非常感谢

最佳答案

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

对于你的第二个问题,在类之外你只能使用像 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; }
};

现在,由于set 是虚拟的,main 中的调用是derived::set。由于 hide 不是虚拟的,因此 main 中的调用将是 base::hide()。问题是,他们每个人将分配给哪个类'i

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

关于c++ - 在 C++ 中重写继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11026104/

相关文章:

java - 扩展类的调用函数(Java)

java - 方法不会覆盖其父类(super class)中的方法

java - Java 方法注释如何与方法覆盖结合使用?

c++ - 从链表中释放内存

javascript - JS 通过绑定(bind)传递参数到对象内部函数以访问对象范围内的特定变量的最佳实践

c++ - 为什么在全局变量的析构函数中调用 thread.join 会失败

java - 在kotlin中将接口(interface)定义为接口(interface)的属性并在接口(interface)实现中提供具体的实现是行不通的

vb.net - 当 key 是对象时实现 containsKey

c++ - 如何优化此数学运算以提高速度

c++ - g++ 在编译时挂起