亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4028 | 回復(fù): 14
打印 上一主題 下一主題

[函數(shù)] 問一個類繼承時關(guān)于虛函數(shù)的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2003-03-03 14:42 |只看該作者 |倒序瀏覽

  1. #include <iostream>;
  2. #include <string>;

  3. using namespace std;
  4. class B
  5. {
  6.         public:
  7.                 B():b_("Base Class")
  8.                 {
  9.                         init();
  10.                 }
  11.                 virtual void init()
  12.                 {
  13.                         cout<<"In class B's init!\n";
  14.                         cout<<b_<<endl;
  15.                 }
  16.         private:
  17.                 string b_;
  18. };

  19. class D : public B
  20. {
  21.         public:
  22.                 D():d_("Derive Class")
  23.                 {
  24.                 }
  25.                 void init()
  26.                 {
  27.                         cout<<"In class D's init!\n";
  28.                         cout<<d_<<endl;
  29.                 }
  30.         private:
  31.                 string d_;
  32. };

  33. main()
  34. {
  35.         B *b;
  36.         b=new D;
  37.         // Out is :
  38.         // In class B's init!
  39.         // Base Class
  40.         // Why not:
  41.         // In class D's init!
  42.         // Derive Class
  43.         return 0;
  44. }
復(fù)制代碼


這是怎么回事,高人幫我解釋解釋,能不能還有其他方法實現(xiàn)?

論壇徽章:
0
2 [報告]
發(fā)表于 2003-03-03 15:29 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

是我沒寫清楚,還是我提的問題太簡單?

怎么沒人回答我。   

論壇徽章:
0
3 [報告]
發(fā)表于 2003-03-03 16:42 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

if you chang class D::init() ==>; virual void init() 就可以了。因為base class calling init() is B::init() .

論壇徽章:
0
4 [報告]
發(fā)表于 2003-03-03 17:00 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

[quote]原帖由 "zhuxa"]if you chang class D::init() ==>; virual void init() 就可以了。因為base class calling init() is B::init() .[/quote 發(fā)表:


D::init()不用聲明virtual它就是virtual,因為基類中已經(jīng)聲明過了。你可以按照你的方法試一試,還是不對。

論壇徽章:
0
5 [報告]
發(fā)表于 2003-03-03 17:09 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

主要是在構(gòu)造base類時,編譯器所能見到的虛函數(shù)是base::init(),在構(gòu)造base class 之后,接著構(gòu)造derive class 時,編譯器見到derive::init()時
如果init() 是虛函數(shù),就把base::init() 替換成derive::init();

論壇徽章:
0
6 [報告]
發(fā)表于 2003-03-03 17:21 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

你的意思是改成這樣,這個我上邊寫那個是一樣的!

  1. #include <iostream>;
  2. #include <string>;

  3. using namespace std;
  4. class B
  5. {
  6.    public:
  7.       B():b_("Base Class")
  8.       {
  9.          init();
  10.       }
  11.       virtual void init()
  12.       {
  13.          cout<<"In class B's init!\n";
  14.          cout<<b_<<endl;
  15.       }
  16.    private:
  17.       string b_;
  18. };

  19. class D : public B
  20. {
  21.    public:
  22.       D():d_("Derive Class")
  23.       {
  24.       }
  25.       virtual void init()
  26.       {
  27.          cout<<"In class D's init!\n";
  28.          cout<<d_<<endl;
  29.       }
  30.    private:
  31.       string d_;
  32. };

  33. main()
  34. {
  35.    B *b;
  36.    b=new D;
  37.    // Out is :
  38.    // In class B's init!
  39.    // Base Class
  40.    // Why not:
  41.    // In class D's init!
  42.    // Derive Class
  43.    return 0;
  44. }
復(fù)制代碼


這樣子輸出的依然是基類的init,我想要得到派生類的init,大哥,你再仔細(xì)看看我的意思。

如果直接調(diào)用b->;init()當(dāng)然是調(diào)用的派生類中的init()。

我問的是在基類的構(gòu)造函數(shù)中調(diào)用init()為什么不被替換為d::init()。

論壇徽章:
0
7 [報告]
發(fā)表于 2003-03-03 19:44 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

這個問題很簡單啊,
根本沒有涉及到虛函數(shù)的問題。

在new D;的時候,先調(diào)用父類B的構(gòu)造函數(shù),那么就打出了
In class B's init!
   Base Class
然后在回到D的構(gòu)造函數(shù),
在D的構(gòu)造函數(shù)里面沒有執(zhí)行代碼,
所以就只打出了上面的兩行代碼


----------------------------
革命尚未成功,同志還需要努力!

論壇徽章:
0
8 [報告]
發(fā)表于 2003-03-03 20:10 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

我現(xiàn)在就是想在B類構(gòu)造時能夠調(diào)用D的init(),由于init()是虛函數(shù),是動態(tài)綁定,故我想在B *ptr=new D時能夠動態(tài)綁頂init(),如果在構(gòu)造時不能實現(xiàn),我只好在B *ptr=new D后,再調(diào)用ptr->;init()來調(diào)用D::init()了。

但是我不明白為什么在B的構(gòu)造時不能夠動態(tài)綁定。   

論壇徽章:
0
9 [報告]
發(fā)表于 2003-03-03 20:19 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

當(dāng)new D的時候,首先要調(diào)用父類的構(gòu)造函數(shù),但這個時候類D的對象并不存在,從編譯器的角度看是不可能知道到底是什么樣的子類構(gòu)造引起的父類對象構(gòu)造,但卻必須調(diào)用一個實際存在的函數(shù),而它能確定的只有B::init()。如果B::init()是個純虛函數(shù)的話,應(yīng)該會報錯。虛函數(shù)在實現(xiàn)的時候可能會象函數(shù)指針一樣指向某個地方,但這種指向也是需要初始化的,你想讓父類的init()指向子類的init(),但因為子類對象還不存在,所以是不可能的。一般而言,不要在構(gòu)造函數(shù)里調(diào)用虛函數(shù)。

論壇徽章:
0
10 [報告]
發(fā)表于 2003-03-03 20:34 |只看該作者

問一個類繼承時關(guān)于虛函數(shù)的問題

[quote]原帖由 "雷斯林"]當(dāng)new D的時候,首先要調(diào)用父類的構(gòu)造函數(shù),但這個時候類D的對象并不存在,從編譯器的角度看是不可能知道到底是什么樣的子類構(gòu)造引起的父類對象構(gòu)造,但卻必須調(diào)用一個實際存在的函數(shù),而它能確定的只有B::init()。?.........[/quote 發(fā)表:


噢,明白了,只有一個實例真正構(gòu)造完成時,才可以用它的虛函數(shù),在構(gòu)造期間時還沒有形成。

謝謝了。   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP