编译器先解析出他对某个名称该使用哪个实例, 然后再检查实例的访问权限是否合法
#include <complex>
class Base1 {
public:
// ...
protected:
int ival;
double dval;
char cval;
// ...
private:
int *id;
// ...
};
class Base2 {
public:
// ...
protected:
float fval;
// ...
private:
double dval;
// ...
};
class Derived : public Base1 {
public:
// ...
protected:
string sval;
double dval;
// ...
};
class MI : public Derived, public Base2 {
public:
void foo( double dval );
void bar();
// ...
protected:
int *ival;
complex<double> cval;
// ...
};
inline void MI::foo( double dval )
{
int id;
MI::cval = dval;
//Base2::dval = 1.0; //没有访问权限
dval = Base1::dval + Derived::dval;//虽然被覆盖了,但原来的只是隐藏, 仍然可以显示的访问
//...
}
inline void MI::bar()
{
int sval;
//ambiguous for dval even cannot access private member declared in class 'Base2'
//but both Derived::dval and Base2::dval are visible in MI
//编译器先解析出他对某个名称该使用哪个实例, 然后再检查实例的访问权限是否合法
//dval = 3.14;
fval = 0;
cval = 'a';
sval = *ival;
//wrong cannot access private member declared in class 'Base2'
//cannot convert from 'const int' to 'int *'
//id = 1;
}