Look at this example
class base {
public:
int m1;
base() {
m1 = 5;
}
};
class der: public base {
public:
int m1;
der() {
m1 = 6;
}
};
int main() {
der d;
cout << d.m1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里对象d的大小是8 byte,它被分配2 m1(一个用于基类,另一个用于派生类).解决的机制是d.m1什么?
编译器m1根据静态类型解析d.这意味着您将获得不同的结果
der d;
cout << d.m1;
Run Code Online (Sandbox Code Playgroud)
和
der d;
base &b = d;
cout << b.m1;
Run Code Online (Sandbox Code Playgroud)
这是因为在解析m1类型的表达式时der,成员会der::m1隐藏base::m1.
在m1中der隐藏的名字base的m1,所以任何访问m1通过一个der对象让你该实例的der::m1.您可以访问base::m1在der像这样的:
class der: public base {
public:
int m1;
der() {
m1 = 6;
base::m1=7; // access base object's m1 inside der
}
};
Run Code Online (Sandbox Code Playgroud)
并且您可以访问基础对象:
der d;
d.base; // base object
std::cout << d.base::m1 >> "\n"; // access base object's m1 outside of der (if allowed)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5821 次 |
| 最近记录: |