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类的这个函数?
许多人提前感谢
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您调用的函数控件,但不具有该函数引用的变量.