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/