程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++私有繼承訪問

C++私有繼承訪問

編輯:C++入門知識

 

環境:VS2010

問題:探討C++私有繼承在外部的訪問

代碼:

 

#include <iostream> 

 

using namespace std; 

class A 

public: 

    A() {  

        a = 0; 

        cout<<"A::A()"<<endl;  

    }      

    int a; 

}; 

class B:protected A 

public: 

    B() { 

        i=1; 

        cout<<"B::B()"<<endl; 

    } 

     

 

     

public: 

    int i; 

};  

int main(void){ 

 

    B b2; 

    b2.i = 20; 

    A *pp = &b2; 

    cout<<"pp->a: "<<pp->a<<" "<<"b2.i "<<b2.i<<endl; 

    return 0; 

 

A *pp = &b2;報錯:// error C2243: “類型轉換”: 從“B *”到“A *”的轉換存在,但無法訪問

即基類的指針指向派生類可以轉換,但是因為是保護型繼承,所以不能訪問。

這裡把A *pp = &b2;改為A *pp = (A*)&b2; 即把指向派生類的指針強制轉換成基類指針,就可以訪問。

效果如下:

\

 

在B類加入以下代碼:

 

void SetB(int n){ 

    this->a = n; 

 

這樣還可以對基類的a進行修改。

如圖:

\

 

雖然可以訪問,但把指向派生類的指針強制轉換成基類指針這種方式不推薦使用,因為已經違背了保護型繼承的原則。

注:C++的強制轉換是很強大的,它不做類型上的檢查。

 

作者 Wentasy

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved