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語言為什麼要有指標呢?
指標是c中的精髓,如果沒有,應該說就是一種很平庸的語言,從本質上說,指標體現了von neumann體系結構計算機也就是當今計算機的特徵,記憶體資料按照當前的解釋決定其意義,其指標的運算更是以機器實現的方式展現出來。具體的主要原因大致如下 1 函式的引數傳遞 c語言只有傳值這樣一種方式,在函式體內不...
為什麼這麼多人說C裡沒有指標,C 中為什麼沒有必要使用指標
c 是有指標的,沒有指標是錯誤的說法。unsafe只不過是一個標記,不能將指標看作不安全的,這是極度錯誤的觀點,程式安全與否與程式設計師的水平有很大關係,指標改用的時候還要用的 指標是非強型別化的,當使用一個指標的時候,指向的不是一個特定的型別,而僅僅是一塊記憶體區。對這個指標進行位移操作,然後向此...
this指標是C 實現()的一種機制?為什麼
b封裝 因為原本被操作物件要通過顯示的引數傳遞的,面嚮物件語言裡封裝後,變成隱式的了於是需要一個this c 規定,this指標是隱含在物件成員函式內的一種指標。當一個物件被建立後,它的每一個成員函式都含有一個系統自動生成的隱含指標 this,用以儲存這個物件的地址。因此this也稱為 指向本物件的...