1樓:
對於繼承方式為protected和private的派生類物件,基類的公有成員、私有成員和保護成員都是不可見的,除非你在派生類中override了基類的成員並宣告為public,所以你把基類指標指向protected和private繼承的派生類物件時,對於基類的公有成員,這個物件到底能不能訪問到呢?他是基類指標,若是基類物件就該能訪問,但指向的是這兩種方式繼承的物件,按理又不能訪問,矛盾了,所以不允許他指向這樣的物件。(同是小白,個人理解)
2樓:小母牛坐坐火炕
public繼承方式下
[cpp] view plaincopy
#include
using namespace std;
class animal
public:
animal(){}
void eat()
cout << "eat/n";
protected:
void play()
cout << "play/n";
private:
void drink()
cout << "drink/n";
class giraffe: public animal
public:
giraffe(){}
void strechneck()
cout << "strech neck /n";
void take()
eat(); // ok,公有繼承下,基類的公有成員對派生類可見
// drink(); // error,公有繼承下,基類的私有成員對派生類不可見,也就是說,派生類不能訪問基類私有成員
play(); // ok,公有繼承下,基類的保護成員對派生類可見
int main()
giraffe gir;
// 以下三條語句說明基類成員對派生類物件的可見性
gir.eat(); // ok,公有繼承下,基類的公有成員對派生類物件可見
// gir.play(); // error,公有繼承下,基類的保護成員對派生類物件不可見
// gir.drink(); // error,公有繼承下,基類的私有成員對派生類物件不可見
// 下面一條語句說明基類成員對派生類的可見性
// 派生類(即對派生類的成員函式,派生類的友元函式和有元類可見性,和派生類物件無關)
gir.take();
gir.strechneck();
return 0;
2.private繼承方式下
[cpp] view plaincopy
#include
using namespace std;
class animal
public:
animal(){}
void eat()
cout << "eat/n";
protected:
void play()
cout << "play/n";
private:
void drink()
cout << "drink/n";
class giraffe: private animal
public:
giraffe(){}
void strechneck()
cout << "strech neck /n";
void take()
eat(); // ok,私有繼承下,基類的公有成員對派生類可見
// drink(); // error,私有繼承下,基類的私有成員對派生類不可見,也就是說,派生類不能訪問基類私有成員
play(); // ok,私有繼承下,基類的保護成員對派生類可見
int main()
giraffe gir;
// 以下三條語句說明基類成員對派生類物件的可見性
// gir.eat(); // error,私有繼承下,基類的公有成員對派生類物件不可見
// gir.play(); // error,私有繼承下,基類的保護成員對派生類物件不可見
// gir.drink(); // error,私有繼承下,基類的私有成員對派生類物件不可見
// 下面一條語句說明基類成員對派生類的可見性
// 派生類(即對派生類的成員函式,派生類的友元函式和有元類可見性,和派生類物件無關)
gir.take();
gir.strechneck();
return 0;
3.protected繼承方式下
[cpp] view plaincopy
#include
using namespace std;
class animal
public:
animal(){}
void eat()
cout << "eat/n";
protected:
void play()
cout << "play/n";
private:
void drink()
cout << "drink/n";
class giraffe: protected animal
public:
giraffe(){}
void strechneck()
cout << "strech neck /n";
void take()
eat(); // ok,保護繼承下,基類的公有成員對派生類可見
// drink(); // error,保護繼承下,基類的私有成員對派生類不可見,也就是說,派生類不能訪問基類私有成員
play(); // ok,保護繼承下,基類的保護成員對派生類可見
int main()
giraffe gir;
// 以下三條語句說明基類成員對派生類物件的可見性
// gir.eat(); // error,保護繼承下,基類的公有成員對派生類物件不可見
// gir.play(); // error,保護繼承下,基類的保護成員對派生類物件不可見
// gir.drink(); // error,保護繼承下,基類的私有成員對派生類物件不可見
// 下面一條語句說明基類成員對派生類的可見性
// 派生類(即對派生類的成員函式,派生類的友元函式和有元類可見性,和派生類物件無關)
gir.take();
gir.strechneck();
return 0;
派生類物件可以使用基類的方法,條件是方法在基類中沒有被宣告為私有的。基類指標可以在不進行顯式型別轉換的情況下指向派生類物件,基類引用可以在不進行顯式型別轉換的情況下引用派生類物件。不過,基類指標或引用只能用於呼叫基類方法,不能呼叫派生類的方法。
通常c++要求引用和指標型別與賦給的型別匹配,但這一規則對繼承來說是個例外。不過這種例外只是單向的,不可以將基類物件和地址賦給派生類引用和指標。
c++中。public,private,protected,用哪種繼承方式好?
3樓:匿名使用者
public公有繼承
private私有繼承
我們知道類的private和protected成員,在類外是不可以使用的.只有public成員可以在類外直接使用.
公有繼承時,基類的private成員派生類也不可用,基類的public和protected成員在派生類中可直接使用.繼承過來(變成派生類相應的public和protected成員)只有public成員在派生類外可以直接使用.
保護繼承時,基類的private成員仍為有私有.基類的public和protected成員變成派生類的protected成員,這時在派生類外也不能直接使用原基類的public成員
私有繼承時,基類的private成員仍為有私有.基類的public和protected成員將變成派生類的private成員.
舉個例子.
class a
;class b:public a
void setage(int nage)
void setmoney(int nmoney)
};b objb;//建立b類的物件objb
objb.m_ntelnum=123456;//可以
objb.m_nage=30;//錯誤.public繼承中基類的protected在派生類中是protected
objb.m_nmoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.
class c:protected a
void setage(int nage)
void setmoney(int nmoney)
};c objc;//建立c類的物件objc
objc.m_ntelnum=123456;//注意這裡和public的區別,這裡錯誤,m_ntelnum變成了c類的protected成員
objc.m_nage=30;//錯誤.protected繼承中基類的protected在派生類中是protected,這與public同相
objc.m_nmoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.
class d:private a
void setage(int nage)
void setmoney(int nmoney)
};d objd;//建立d類的物件objd
objd.m_ntelnum=123456;//錯誤,m_ntelnum變成了d類的private成員
objd.m_nage=30;//錯誤.private繼承中基類的protected在派生類中是private
objd.m_nmoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.
從例子來看,三種繼承從派生類內部引用來看好像沒有區別,只在類外引用時表現不同.現在還看不出public和protected繼承的區別
那再看一個例子.
class e:public b
void setage(int nage)
void setmoney(int nmoney)
};e obje;//
obje.m_ntelnum=123456;//可以
//其它的兩個就不能用了.
class f:public c
void setage(int nage)
void setmoney(int nmoney)
};f objf;
objf.m_ntel=123456;//錯誤,因為這是f的保護成員.注意與e類區別
class g:public d
void setage(int nage)
void setmoney(int nmoney)
};//那g在類外就沒有了可以引用的繼承過來成員了!
//這些繼承方式是很難理解的.最好的辦法就是多寫**去試.
關於c基類派生類的引用和指標,關於C 基類 派生類的引用和指標
1 首先回答第一個問題 用基類的指標指向派生類的物件,這樣做可以體現c 的重要特性 多型性。多型性其實也就是動態聯編。這樣做的好處是 當基類裡面定義了一個虛成員函式的時候,其派生類裡面定義了同名的函式可以實現覆蓋。你的基類指標指向那個物件,就呼叫那個物件的該方法。我舉個例子你應該就明白了 class...
c 語言,什麼是基類,什麼是派類
在 c 中,繼承機制通過類的派生實現,被繼承的類稱為基類或父類 在繼承類的基礎 上建立的新類稱為派生類或子類。派生類的定義格式為 class 派生類名 繼承方式基類名 1,繼承方式基類名 2,繼承方式基類名 n 其中,定義中的基類名必須是已有類的名稱,派生類名則是新建的類名。一個派生類可 以只有一個...
為什麼華為matebook X突然不能指紋解鎖了
華為matebookx的指紋設定通過系統配置 指紋 去設定 登入選項 設定 windows 帳戶密碼 設定 pin 碼 設定指紋。1 開啟 matebook 管家,點選 系統配置 指紋 去設定 進入 windows 系統的 登入選項 頁面 2 在 登入選項 頁面設定 windows 帳戶密碼。在 密...