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

時間 2021-08-11 17:12:03

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 帳戶密碼。在 密...