環境: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