- 最後登錄
- 2024-4-23
- 在線時間
- 9507 小時
- 註冊時間
- 2011-10-7
- 閱讀權限
- 95
- 精華
- 1
- UID
- 10394418
- 帖子
- 89
- 積分
- 174 點
- 潛水值
- 51520 米
| 若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com 本帖最後由 c780702 於 2013-9-3 10:28 AM 編輯
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- class CShape // 定義抽象類別CShape
- {
- public:
- virtual int area()=0; // 定義area()為泛虛擬函數
- void show_area()
- {
- cout << "area = " << area() << endl;
- }
- ~CShape() // ~CShape() 解構元
- {
- cout << "~CShape()解構元被呼叫了..." << endl;
- system("pause");
- }
- };
- class CWin : public CShape // 定義由CShape所衍生出的子類別CWin
- {
- protected:
- int width, height;
-
- public:
- CWin(int w=10, int h=10):width(w),height(h){} // CWin()建構元
-
- virtual int area() {return width*height; }
-
- void show_area() {
- cout << "CWin物件的面積 = " << area() << endl;
- }
- ~CWin() // ~CWin() 解構元
- {
- cout << "~CWin()解構元被呼叫了..." << endl;
- system("pause");
- }
- };
- class CMiniWin : public CWin // 定義由CWin所衍生出的子類別CMiniWin
- {
- public:
- CMiniWin(int w,int h):CWin(w,h){} // CMiniWin()建構元
-
- virtual int area() {
- return (int) (0.5*width*height);
- }
- void show_area(){
- cout << "CMiniWin物件的面積 = " << area() << endl;
- }
- ~CMiniWin() // ~CMiniWin() 解構元
- {
- cout << "~CMiniWin()解構元被呼叫了..." << endl;
- system("pause");
- }
- };
- int main(void)
- {
- CShape *ptr=new CWin(50,60);
- ptr->show_area();
- cout << "銷毀CWin物件..." << endl;
- delete ptr;
- cout << endl;
-
- ptr=new CMiniWin(50,50);
- ptr->show_area();
- cout << "銷毀CMiniWin物件..." << endl;
- delete ptr;
- cout << endl;
-
- CMiniWin m_win(100,100);
- m_win.show_area();
-
- system("pause");
- return 0;
- }
複製代碼 這個程式碼是錯誤範例
因為61行與67行並不會呼叫正確的show_area()函數
而63行與69行也只會呼叫~CShap()解構元
修正的方法我已經知道了
但我對書本裡對這個程式碼的講解有疑問
書本裡說:
因為執行delete指令時,編譯器所知到的訊息只是ptr的型態為基底類別CShape,而ptr真正指向之物件型態會無法得知,因此編譯器就假設ptr是指向由基底類別所建立之物件。
我的疑問:
然而61行的show_area()函數呼叫是在delete指令之前,60行的CShape *ptr=new CWin(50,60),不是代表ptr指向CWin(50,60)嗎(動態記憶體配置)?這樣ptr怎麼會不知道指向之物件的型態呢?
66.67行的地方也是,ptr也不知道指向之物件的型態,於是便呼叫錯誤的show_area()函數。
... |
|