1樓:月無痕
虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是:
(1)純虛函式只有定義,沒有實現;而虛函式既有定義,也有實現的**。
純虛函式一般沒有**實現部分,如
virtual void print() = 0;
而一般虛函式必須要有**的實現部分,否則會出現函式未定義的錯誤。
virtual void print()
(2)包含純虛函式的類不能定義其物件,而包含虛函式的則可以。
c++中 虛函式與純虛函式的區別是什麼?
2樓:月無痕
虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是:
(1)純虛函式只有定義,沒有實現;而虛函式既有定義,也有實現的**。
純虛函式一般沒有**實現部分,如
virtual void print() = 0;
而一般虛函式必須要有**的實現部分,否則會出現函式未定義的錯誤。
virtual void print()
(2)包含純虛函式的類不能定義其物件,而包含虛函式的則可以。
c++中虛函式和純虛函式的作用與區別
3樓:物理公司的
虛函式為了過載和多型的需要,在基類中是有定義的,即便定義是空,所以子類中可以重寫也可以不寫基類中的此函式!
純虛函式在基類中是沒有定義的,必須在子類中加以實現
虛函式引入原因:為了方便使用多型特性,我們常常需要在基類中定義虛函式。
class cman
;void move();
private:
};class cchild : public cman
;private:
};cman m_man;
cchild m_child;
cman *p ;//這才是使用的精髓,如果不定義基類的指標去使用,沒有太大的意義
p = &m_man ;
p->eat(); //始終呼叫cman的eat成員函式,不會呼叫 cchild 的
p = &m_child;
p->eat(); //如果子類實現(覆蓋)了該方法,則始終呼叫cchild的eat函式
//不會呼叫cman 的 eat 方法;如果子類沒有實現該函式,則呼叫cman的eat函式
p->move(); //子類中沒有該成員函式,所以呼叫的是基類中的
純虛函式
引入原因:
1、同「虛函式」;
2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
純虛函式就是基類只定義了函式體,沒有實現過程,定義方法如: virtual void eat() = 0; 不要
在cpp中定義;純虛函式相當於介面,不能直接例項話,需要派生類來實現函式定義;
有的人可能在想,定義這些有什麼用啊
,我覺得很有用,比如你想描述一些事物的屬性給別人,而自己不想去實現,就可以定義為純虛函式。說的再透徹一些。比如蓋樓房,你是老闆,你給建築公司描述清楚你的樓房的特性,多少層,樓頂要有個花園什麼的,建築公司就可以按照你的方法去實現了,如果你不說清楚這些,可能建築公司不太了解你需要樓房的特性。
用純需函式就可以很好的分工合作了
虛函式和純虛函式區別
觀點一:
類裡宣告為虛函式的話,這個函式是實現的,哪怕是空實現,它的作用就是為了能讓這個函式在它的子類裡面可以被過載,這樣的話,這樣編譯器就可以使用後期繫結來達到多型了
純虛函式只是乙個介面,是個函式的宣告而已,它要留到子類裡去實現。
class a
觀點二:
虛函式在子類裡面也可以不過載的;但純虛必須在子類去實現,這就像java的介面一樣。通常我們把很多函式加上virtual,是乙個好的習慣,雖然犧牲了一些效能,但是增加了物件導向的多型性,因為你很難預料到父類裡面的這個函式不在子類裡面不去修改它的實現
觀點三:
虛函式的類用於「實作繼承」,繼承介面的同時也繼承了父類的實現。當然我們也可以完成自己的實現。純虛函式的類用於「介面繼承」,主要用於通訊協議方面。
關注的是介面的統一性,實現由子類完成。一般來說,介面類中只有純虛函式的。
觀點四:
帶純虛函式的類叫虛基類,這種基類不能直接生成物件,而只有被繼承,並重寫其虛函式後,才能使用。這樣的類也叫抽象類。
虛函式是為了繼承介面和預設行為
純虛函式只是繼承介面,行為必須重新定義
4樓:匿名使用者
包含純虛函式的類不可以例項化。
《c++》中虛函式與純虛函式的區別是什麼?
5樓:月無痕
虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是:
(1)純虛函式只有定義,沒有實現;而虛函式既有定義,也有實現的**。
純虛函式一般沒有**實現部分,如
virtual void print() = 0;
而一般虛函式必須要有**的實現部分,否則會出現函式未定義的錯誤。
virtual void print()
(2)包含純虛函式的類不能定義其物件,而包含虛函式的則可以。
c++中虛函式和純虛函式有什麼區別?
6樓:鍋勁
使用虛函式,我們可以靈活的進行動態繫結,當然是以一定的開銷為代價。 如果父類的函式(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函式(方法)設為virtual 函式名=0 我們把這樣的函式(方法)稱為純虛函式。
也就是說,虛函式 ,子類可以不重寫,直接繼承父類 的方法來使用,也可以重寫
但是 純虛函式是子類是必須重寫了才可以使用
7樓:衄潲
純虛函式,沒有方法體,留給子類去實現。而虛函式必須有方法體,子類可以重寫,也可以不重寫
8樓:匿名使用者
虛函式可是實現方法
純虛函式沒有函式體,也就是不能實現方法,只能給後面的派生類供宣告,後面跟著=0;
有純虛函式一般為抽象基類
9樓:匿名使用者
避免繼承帶來的二義性
c/c++面試題:虛函式與純虛函式有什麼區別
10樓:匿名使用者
虛函式和純虛函式有以下所示方面的區別
(1)類裡如果聲
明了虛函式,這個函式是實現的,哪怕是空實現,它的作用就是為了能讓這個函式在它的子類裡面可以被覆蓋,這樣的話,這樣編譯器就可以使用後期繫結來達到多型了。純虛函式只是乙個介面,是個函式的宣告而已,它要留到子類裡去實現。
(2)虛函式在子類裡面也可以不過載的;但純虛函式必須在子類去實現,這就像java的介面一樣。通常把很多函式加上virtual,是乙個好的習慣,雖然犧牲了一些效能,但是增加了物件導向的多型性,因為很難預料到父類裡面的這個函式不在子類裡面不去修改它的實現。
(3)虛函式的類用於「實作繼承」,繼承介面的同時也繼承了父類的實現。當然大家也可以完成自己的實現。純虛函式關注的是介面的統一性,實現由子類完成。
(4)帶純虛函式的類叫虛基類,這種基類不能直接生成物件,而只有被繼承,並重寫其虛函式後,才能使用。這樣的類也叫抽象類。
c++中虛函式跟純虛函式的區別是什麼
11樓:塵封夢想
定了純虛函式之後這個類就變成了 虛基類 想繼承他的類 就必須要自己定義這個純虛函式 不然這個類就不可以定義物件
虛函式不用
c++中的純虛函式與虛函式在應用上有什麼差別??
12樓:
純虛函式就是為了阻止這個類的例項化。使其成為抽象類。
當然虛函式不提供實現看起來也能阻止類的例項化,但它和純虛函式比起來還有以下不足:
1、一方面,從語法上說是不清晰的,你的類的使用者在在看到你的類的定義的時候無法確定哪些函式是沒有提供實現的虛函式,而如果你寫成純虛函式就非常明確,一眼就可以看出來。
2、另一方面,虛函式不提供實現,如果使用者試圖例項化這個類,在編譯階段無法發現錯誤,必須等到鏈結階段才能發現,而且鏈結錯誤也僅僅是「無法解析的外部符號」,這種錯誤提示很不明確,當錯誤較多時很難找到真正的原因。 而如果是純虛函式則編譯器在編譯階段就直接會報錯,並且會在錯誤中明確告知使用者不應例項化抽象類,非常便於定位錯誤。
13樓:匿名使用者
如果乙個類中含有純虛函式, 則這個類則被視為抽象基類, 無法例項化, 即不能生成以這個基類為型別的例項.
(注意, 為了實現多型, 這個基類的指標是可以被建立並指向繼承這個基類的例項)
虛函式可以被實現, 也可以被覆蓋(也可以不被覆蓋, 視乎繼承類是否有重新實現這個函式). 呼叫時究竟使用哪個過程取決於呼叫的物件是基類物件還是繼承類物件.
純虛函式不能被實現, 因此強制要求所有的繼承類去覆蓋這個純虛函式, 否則不讓編譯通過.
==== 分割線 ====
2015.3.18
純虛函式也可以有實現。
c++中純虛函式和虛函式在定義上的區別是什麼
14樓:志祥羅志祥
主要就是純虛函式相比虛函式在定義的時候沒有定義函式體而且會在定義的時候在後面多加一句「=0」
c 中虛函式和純虛函式的作用與區別
包含純虛函式的類不可以例項化。c 中 虛函式與純虛函式的區別是什麼?虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是 1 純虛函式只有定義,沒有實現 而虛函式既有定義,也有實現的 純虛函式一般沒有 實現部分,如 virtual void print 0 而一般虛函式必須要有 的實現部分,否...
C中虛函式,虛基類,virtual的用法我很暈,高手能幫
c 中有繼承的概念,即乙個基類總領一組的類!而虛函式就是把這一組的類共同的特徵和行為抽出來,放在基類裡面,好比宣告,而具體到每個派生類時,再把這個特徵和行為 函式 描述出來。好處就是利用向上轉型這個特點,使用基類的物件來呼叫這一組類的物件的函式。比如定義乙個基類動物,派生貓,狗等等,我就可以在動物類...
包含純虛函式的基類是否不能用作定義物件
沒問題,不能定義物件但可以定義物件的指標和物件的引用。含有純虛函式的類是不可以用來建立物件的,因為它是虛基類 這得分清楚含有純虛函式的類與虛基類是兩個不同的概念。1 含有純虛函式的類是不能建立物件 2 虛基類是指在繼承的時候,通過虛繼承的方式,繼承的基類。含有純虛函式的類在繼承的時候,可以不加vir...