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

  免費注冊 查看新帖 |

Chinaunix

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

[C++] C++中帶參數(shù)、拷貝構(gòu)造函數(shù)的繼承問題。 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2006-04-19 17:56 |只看該作者 |倒序瀏覽
我這樣寫:

  1. class Base{
  2. public:
  3.         Base();
  4.         Base(int);
  5.         Base(Base&);
  6.         Base& operator=( Base& other);
  7. private:
  8.         int m_i;
  9. };

  10. class Derive : public Base{
  11. public:
  12.         Derive();
  13. };

  14. int main()
  15. {
  16.         Derive d(12);
  17.         Derive other(d);
  18.         Derive c;
  19.         c = d;
  20. }
復(fù)制代碼
]
我用g++編譯,得到這樣的信息:
"錯誤:對 ‘Derive:erive(int)’ 的調(diào)用沒有匹配的函數(shù)"

我的問題是,帶參數(shù)的構(gòu)造函數(shù)不能繼承嗎?為什么?Derive:erive(Derive&拷貝繼承函數(shù)、復(fù)制函數(shù)的繼承也不太明白。望大蝦指教。

論壇徽章:
0
2 [報告]
發(fā)表于 2006-04-19 18:09 |只看該作者
構(gòu)造函數(shù)無法實現(xiàn)你這里所說的"繼承",只能被派生類調(diào)用,但是operator可以繼承.

[ 本帖最后由 converse 于 2006-4-19 18:15 編輯 ]

論壇徽章:
0
3 [報告]
發(fā)表于 2006-04-19 18:14 |只看該作者
如果你沒有自己提供一個copy ctor和default ctor的話,那么編譯器會幫你生成一個,在里面調(diào)用基類的相應(yīng)的ctor:


  1. #include <iostream>
  2. using namespace std;
  3. class Base{
  4. public:
  5.         Base(){}
  6.         Base(int){}
  7.         Base(Base&)
  8.         {
  9.          cout << "Base() copy ctor\n";
  10.         }
  11.         Base& operator=( Base& other)
  12.         {
  13.               cout << "operator = in Base\n";
  14.               
  15.               return other;
  16.         }
  17. private:
  18.         int m_i;
  19. };

  20. class Derive : public Base{
  21. public:
  22.         Derive(){}
  23. };

  24. int main()
  25. {
  26.         Derive d;
  27.         Derive other(d);
  28.         Derive c;
  29.         c = d;
  30.         getchar();
  31.         
  32.         return 0;
  33. }

復(fù)制代碼

論壇徽章:
0
4 [報告]
發(fā)表于 2006-04-19 22:25 |只看該作者
謝謝版主大哥。
也就是說編譯器會自動為我生成copy ctor和default ctor以及operator=三個函數(shù);在編譯器生成的copy ctor和default ctor中會調(diào)用基類的構(gòu)造函數(shù),但不是繼承的基類的構(gòu)造函數(shù)。如果我定義了一個帶參數(shù)的構(gòu)造函數(shù), 如Base(int){},但是派生類卻沒有Derive(int)這樣的構(gòu)造函數(shù);為什么不能繼承這個函數(shù)。

派生類里不定義operator=但是base類里定義了,那么派生類里的operator=是繼承的基類的,還是編譯器自動生成一個?如果是繼承的,那么如果派生類里定義了新的數(shù)據(jù),這個運算符就要定義成virtual了?而且就算派生類里新定義的數(shù)據(jù)就算沒有指針,不自己重新定義運算符,新的數(shù)據(jù)就不會正確被復(fù)制,是嗎?

再有,如果需要定義成virtual,在定義中需要調(diào)用基類的=運算符是不是這樣寫:
  1. this=>Base::operator=(other);
復(fù)制代碼

論壇徽章:
0
5 [報告]
發(fā)表于 2006-04-19 22:42 |只看該作者
糾正一下我上面的說法,
>>果你沒有自己提供一個copy ctor和default ctor的話,那么編譯器會幫你生成一個,在里面調(diào)用基類的相應(yīng)的ctor:

這句話不對,應(yīng)該是這樣子:如果你已經(jīng)定義了其他的ctor而沒有提供copy和default ctor,那么編譯器也不會為你提供了;反之,如果你的類里面沒有任何ctor,那么編譯器為為你生成這兩個ctor.
如:

  1. class Test
  2. {
  3.     Test(int) // 定義了非copy和default的ctor
  4.    {
  5.    }
  6. };

  7. int main()
  8. {
  9.      Test t;

  10.      return 0;
  11. }
復(fù)制代碼

以上這段代碼就是編譯不過去的,因為缺少default ctor,但是如果test類中原來沒有任何的ctor就是可以過去的

但是,只要為你生成就會去調(diào)用基類的ctor,至于如何調(diào)用以及是否能夠正確調(diào)用就不好說了,所以如果你對編譯器的行為不放心還是自己做這一塊.

[ 本帖最后由 converse 于 2006-4-19 22:43 編輯 ]

論壇徽章:
0
6 [報告]
發(fā)表于 2006-04-19 22:45 |只看該作者
>>如Base(int){},但是派生類卻沒有Derive(int)這樣的構(gòu)造函數(shù);為什么不能繼承這個函數(shù)。
沒懂,這兩個函數(shù)函數(shù)名稱都不一樣了,如何能夠在調(diào)用int的derive構(gòu)造的時候找不到定義就去找base里面的呢?這個顯然是不合理的.

>>派生類里不定義operator=但是base類里定義了,那么派生類里的operator=是繼承的基類的,還是編譯器自動生成一個?
如果派生類沒有,就去基類找,再沒有,編譯器就會為你生成了.

論壇徽章:
0
7 [報告]
發(fā)表于 2006-04-19 22:56 |只看該作者
是不是說構(gòu)造函數(shù)不能繼承?copy cotor是什么啊

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
8 [報告]
發(fā)表于 2006-04-19 23:04 |只看該作者
好像只有類的繼承,沒有函數(shù)的繼承吧?

論壇徽章:
0
9 [報告]
發(fā)表于 2006-04-19 23:13 |只看該作者
原帖由 converse 于 2006-4-19 22:42 發(fā)表
這句話不對,應(yīng)該是這樣子:如果你已經(jīng)定義了其他的ctor而沒有提供copy和default ctor,那么編譯器也不會為你提供了;反之,如果你的類里面沒有任何ctor,那么編譯器為為你生成這兩個ctor.


這樣說不對吧,應(yīng)該是你定義了其他的ctor而沒有提供default ctor,那么編譯器不會為你提供default ctor;
雖然定義了其他的ctor,如果沒有定義copy ctor那么編譯器仍然會提供copy ctor的。

  1. #include <iostream>
  2. using namespace std;

  3. class A{
  4. public:
  5.         A(int i) :m_i(i){}
  6.         void print() { cout<<m_i<<endl; }
  7. private:
  8.         int m_i;
  9. };

  10. int main()
  11. {
  12. //        A a1;
  13.         A a2(2);
  14.         A a3(a2);
  15.         a3.print();
  16.         return 0;
  17. }
復(fù)制代碼

可以通過編譯。輸出為2,說明copy ctor由編譯器自動提供給我們的。

[ 本帖最后由 2eye 于 2006-4-19 23:15 編輯 ]

論壇徽章:
0
10 [報告]
發(fā)表于 2006-04-19 23:15 |只看該作者

回復(fù) 9樓 2eye 的帖子

沒錯,謝謝指正!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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