如果base和derive类都有相同的成员变量,编译器如何解析调用哪个成员?

use*_*379 1 c++

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什么?

Jon*_*Jon 5

编译器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.

  • 你可能永远不应该这样做. (2认同)

jua*_*nza 5

m1der隐藏的名字basem1,所以任何访问m1通过一个der对象让你该实例的der::m1.您可以访问base::m1der像这样的:

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)