課程
/后端開發(fā)
/C++
/C++遠(yuǎn)征之多態(tài)篇
能否在棧上實(shí)現(xiàn)?不用new
2015-09-14
源自:C++遠(yuǎn)征之多態(tài)篇 3-4
正在回答
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
?* 定義動(dòng)物類:Animal
?* 虛函數(shù):eat()
?* 純虛函數(shù):move()
?* 數(shù)據(jù)成員:m_strName
?*/
class Animal
{
public:
? ? // 默認(rèn)構(gòu)造函數(shù)
? ? Animal(){}
? ? // 含參構(gòu)造函數(shù)
Animal(string name){m_strName = name; cout << "Animal" << endl;}
? ? // 虛析構(gòu)函數(shù)
virtual ~Animal(){cout << "~Animal" << endl;}
? ? // 虛成員函數(shù)
virtual ?void eat(){cout << "Animal--" << m_strName << "-- eat" << endl;}
? ? // 純虛函數(shù)
virtual void move() = 0;
? ? // 數(shù)據(jù)成員
string m_strName;
};
?* 定義狗類:Dog
?* 公有繼承動(dòng)物類
?* 虛成員函數(shù):eat()、move()
class Dog : public Animal
? ? Dog(){}
Dog(string name){m_strName = name; cout << "Dog" << endl;}
virtual ~Dog(){cout << "~Dog" << endl;}
? ? // 虛成員函數(shù)eat()
virtual void eat(){cout << "Dog--" << m_strName << " -- eat" << endl;}
? ? // 虛成員函數(shù)move()
virtual void move(){cout << "Dog--" << m_strName << " -- move" << endl;}
int main(void)
? ? // 通過(guò)動(dòng)物類實(shí)例化狗類
? ? Dog a(狗類);
? ? Animal *pa = a;
? ? // 調(diào)用成員函數(shù)
pa->eat();
? ? pa->move();
? ? // 釋放內(nèi)存
delete *pa;
pa = NULL;
? ??
return 0;
}
可以啊,Dog dog(“狗類” );Animal ani = dog;
你在函數(shù)中定義的對(duì)象都是在棧上的。
new 是實(shí)例化對(duì)象的語(yǔ)法,存在堆上的,為什么要用棧呢?棧是存儲(chǔ)函數(shù)參數(shù)的臨時(shí)地方。
星小辰 提問(wèn)者
舉報(bào)
本教程將帶領(lǐng)大家體會(huì)面向?qū)ο笕筇匦灾械亩鄳B(tài)特性
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2017-03-30
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
?* 定義動(dòng)物類:Animal
?* 虛函數(shù):eat()
?* 純虛函數(shù):move()
?* 數(shù)據(jù)成員:m_strName
?*/
class Animal
{
public:
? ? // 默認(rèn)構(gòu)造函數(shù)
? ? Animal(){}
? ? // 含參構(gòu)造函數(shù)
Animal(string name){m_strName = name; cout << "Animal" << endl;}
? ? // 虛析構(gòu)函數(shù)
virtual ~Animal(){cout << "~Animal" << endl;}
? ? // 虛成員函數(shù)
virtual ?void eat(){cout << "Animal--" << m_strName << "-- eat" << endl;}
? ? // 純虛函數(shù)
virtual void move() = 0;
public:
? ? // 數(shù)據(jù)成員
string m_strName;
};
/**
?* 定義狗類:Dog
?* 公有繼承動(dòng)物類
?* 虛成員函數(shù):eat()、move()
?*/
class Dog : public Animal
{
public:
? ? // 默認(rèn)構(gòu)造函數(shù)
? ? Dog(){}
? ? // 含參構(gòu)造函數(shù)
Dog(string name){m_strName = name; cout << "Dog" << endl;}
? ? // 虛析構(gòu)函數(shù)
virtual ~Dog(){cout << "~Dog" << endl;}
? ? // 虛成員函數(shù)eat()
virtual void eat(){cout << "Dog--" << m_strName << " -- eat" << endl;}
? ? // 虛成員函數(shù)move()
virtual void move(){cout << "Dog--" << m_strName << " -- move" << endl;}
public:
? ? // 數(shù)據(jù)成員
string m_strName;
};
int main(void)
{
? ? // 通過(guò)動(dòng)物類實(shí)例化狗類
? ? Dog a(狗類);
? ? Animal *pa = a;
? ? // 調(diào)用成員函數(shù)
pa->eat();
? ? pa->move();
? ? // 釋放內(nèi)存
delete *pa;
pa = NULL;
? ??
return 0;
}
2015-12-18
可以啊,Dog dog(“狗類” );Animal ani = dog;
2015-09-14
你在函數(shù)中定義的對(duì)象都是在棧上的。
2015-09-14
new 是實(shí)例化對(duì)象的語(yǔ)法,存在堆上的,為什么要用棧呢?棧是存儲(chǔ)函數(shù)參數(shù)的臨時(shí)地方。