第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

學(xué)習(xí)C ++:多態(tài)性和切片

學(xué)習(xí)C ++:多態(tài)性和切片

C++
www說 2019-09-24 16:32:54
考慮以下示例:#include <iostream>using namespace std;class Animal{public:    virtual void makeSound() {cout << "rawr" << endl;}};class Dog : public Animal{public:    virtual void makeSound() {cout << "bark" << endl;}};int main(){    Animal animal;    animal.makeSound();    Dog dog;    dog.makeSound();    Animal badDog = Dog();    badDog.makeSound();    Animal* goodDog = new Dog();    goodDog->makeSound();}輸出為:rawrbarkrawrbark但是我認(rèn)為輸出肯定應(yīng)該是“ raw kark bark bark”。badDog怎么了?更新:您可能對(duì)我的另一個(gè)問題感興趣。
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊

這是一個(gè)稱為“切片”的問題。

Dog()創(chuàng)建一個(gè)Dog對(duì)象。如果您要致電Dog().makeSound(),它將按您期望的那樣打印“樹皮”。

問題是,你是初始化badDog,這是類型的對(duì)象Animal,與此Dog。由于Animal只能包含Animal和,而不能包含從派生的任何內(nèi)容Animal,因此它會(huì)占用的Animal一部分Dog并以此進(jìn)行初始化。

的類型badDog總是Animal; 它永遠(yuǎn)不可能是別的。

在C ++中獲得多態(tài)行為的唯一方法是使用指針(如您的goodDog示例所示)或使用引用。

引用(例如Animal&)可以引用從派生的任何類型的對(duì)象,Animal而指針(例如Animal*)可以指向從派生的任何類型的對(duì)象Animal。Animal但是,平原永遠(yuǎn)是Animal,別無其他。

諸如Java和C#之類的某些語言具有引用語義,其中(在大多數(shù)情況下)變量只是對(duì)對(duì)象的引用,因此給定Animal rex;,rex實(shí)際上只是對(duì)某些對(duì)象的引用Animalrex = new Dog()而使對(duì)象rex引用新Dog對(duì)象。

C ++不能那樣工作:C ++中變量不引用對(duì)象,變量是對(duì)象。如果您rex = Dog()用C ++講,它會(huì)將一個(gè)新Dog對(duì)象復(fù)制到中rex,并且由于rex實(shí)際上是類型Animal,因此將對(duì)其進(jìn)行切片,而僅Animal復(fù)制部分。這些稱為值語義,這是C ++中的默認(rèn)語義。如果要在C ++中使用引用語義,則需要顯式使用引用或指針(這兩個(gè)引用與C#或Java中的引用都不相同,但是更相似)。


查看完整回答
反對(duì) 回復(fù) 2019-09-24
?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

Animal badDog = Dog();

    ad.makeSound();

實(shí)例化a Dog并將其按值分配給Animal變量時(shí),將對(duì)對(duì)象進(jìn)行切片。基本上,這意味著您要?jiǎng)冸x所有Dog-ness badDog并將其加入基類。


為了對(duì)基類使用多態(tài),必須使用指針或引用。


查看完整回答
反對(duì) 回復(fù) 2019-09-24
  • 3 回答
  • 0 關(guān)注
  • 485 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)