C 為什麼基類指標不能指向繼承方式為protected與p

2021-08-04 21:38:48 字數 5577 閱讀 8035

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也稱為 指向本物件的...