1. 程式人生 > >c++之訪問從基類繼承的成員

c++之訪問從基類繼承的成員

1當派生類與基類中有相同成員時:若沒有特別限定,則通過派生類物件使用的是派生類的同名成員。如果要通過派生類物件訪問基類中被隱藏的同名成員,應使用基類名和作用域操作符“::”來限定
#include <iostream>
using namespace std;
class Base1 {   
public:
    int var;
    void fun() { cout << "Member of Base1" << endl; }
};
class Base2 {   
public:
    int var;
    void fun() { cout << "Member of Base2" << endl; }
};
class Derived: public Base1, public Base2 {
public:
    int var;    
    void fun() { cout << "Member of Derived" << endl; }
};

int main() {
    Derived d;
    Derived *p = &d;

  //訪問Derived類成員
    d.var = 1;
    d.fun();    

    //訪問Base1基類成員
    d.Base1::var = 2;
    d.Base1::fun(); 

    //訪問Base2基類成員
    p->Base2::var = 3;
    p->Base2::fun();    

    return 0;
}

2如果從不同基類中繼承了同名成員,但在派生類中沒有定義同名成員,“派生類物件或引用.成員名”、“派生類指標—>成員名”訪問成員存在二義性問題。
//7_7.cpp
#include <iostream>
using namespace std;
class Base0 {   //定義基類Base0
public:
    int var0;
    void fun0() { cout << "Member of Base0" << endl; }
};
class Base1: public Base0 { //定義派生類Base1 
public: //新增外部介面
    int var1;
};
class Base2: public Base0 { //定義派生類Base2 
public: //新增外部介面
    int var2;
};

例7-7  多繼承時的二義性和冗餘問題
class Derived: public Base1, public Base2 {
public: 
    int var;
    void fun() 
  { cout << "Member of Derived" << endl; }
};

int main() {    //程式主函式
    Derived d;
    d.Base1::var0 = 2;
    d.Base1::fun0();
    d.Base2::var0 = 3;
    d.Base2::fun0();
    return 0;
}
參考:程式參考清華大學鄭莉《C++程式語言設計》