一年多前,我去面試一家印度公司,做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也就沒有必要了。