多继承下成员访问

编译器先解析出他对某个名称该使用哪个实例, 然后再检查实例的访问权限是否合法

#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;

}

posted @ 2011-08-25 09:52  lidan  阅读(195)  评论(0编辑  收藏  举报