程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> abstract virtual在C++和C#中的比較

abstract virtual在C++和C#中的比較

編輯:關於C語言

一年多前,我去面試一家印度公司,做C++的,待遇不錯。其中一個題目是讓我介紹 vitual base class, 我很久沒看C++教材了,突然咯噔一下,這是個啥東東,好像很熟悉,但從來沒用過,反正想不 起來了。用本山大叔的話說,我啥時給你送過秋波啊,秋波是啥玩意兒?是啊, vitual base class 是 啥玩意兒呢?

回家一翻書,原來如此。現在總結記錄一下,“以免你忘記”(《馬語者》)

virtual關鍵字在 C++ 和 C#中都能聲明 virtual methods,這些methods在派生類中可以被重寫。而 abstract關鍵字是C#引入的,它用來聲明不帶函數體的virtual method,在C++種,這個工作也是由 virtual關鍵字來做的,我們叫 pure virtual method。而包含了pure virtual method的類就被叫做 abstract class。另外,對這兩個關鍵字,還有幾個地方需要注意。

C++:

C++中,所有跟多態相關的事都是由virtual指定的。除了指定多態外,virtual還有兩個特殊的用法:

Virtual base class

為解決多重繼承時的二義性提出來的。簡單的說就是,基類A有兩派生類:B和C,然後D繼承自B和C。 這裡有個問題,D裡面有兩份A,不僅浪費,而且問題很多。virtual base class就是為讓D只有一份A的。 使用方法是:

class B :virtual public A

class C :virtual public A

class D: public B, public C

Abstract class

任何含有pure virtual function的類都被稱為abstract class. pure virtual funciton是指沒有任 何函數實現,同時函數有 ‘=0’標記,類似下面這個函數。

void virtual foo() = 0;

注意,與C#不同,在C++中,abstract不是一個關鍵字。

C#:

Virtual 關鍵字用來修飾propertIEs 和 methods,表明繼承類可以重寫。跟C++比,這個關鍵字在C# 中的作用減弱很多。在C++中,任何跟多態相關的聲明都是virtual來做的。而在C#中,這種獨裁的權力大 部分被interface, abstract 分走了。

abstract 關鍵字可以修飾的比較多,包括 classes, methods, propertIEs, indexers, 和 events.   這個關鍵字比較猛。這也是可以理解的,因為面向對象的思想主要就是定義一個類的門面的,這個從 23種設計模式就可以看出來,而abstract就是干這個的,所謂生逢其時啊。

總結來說,在C++中只用virtual作為關鍵字,abstract只是包含pure virtual  methods的某一部分 類的統稱:abstract class。而在C#中,virtual,abstract都是關鍵字,abstract被明確出來,干的事 情還是跟C++一樣的。C#中沒有多重繼承,virtual base class也就沒有必要了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved