(一)在子類中使用new時,隱藏了父類同型函數,如果不用new編譯器報警告。隱藏的效果是調用申明類型的函數定義執行,如:
class A
{
void Fun();
}
class B:A
{
new void Fun();
}
A a = new B();
A爲申明類型,B爲實例類型,則a.Fun()執行A.Fun(),如申明爲B b = new B(); b.Fun()執行B.Fun();
無論父類函數是否有virtual修飾符,以上效果不變。
(二)override重寫關鍵字必須與基類中virtual, abstract 或override使用,不可直接使用,否則編譯報錯。override效果是覆蓋父類同型函數,覆蓋的效果是執行實例類型的函數定義,如:
無論申明爲A a = new B(),還是B b = new B(), 均執行B.Fun();
A爲申明類型,B爲實例類型,則a.Fun()執行A.Fun(),如申明爲B b = new B(); b.Fun()執行B.Fun();
無論隱藏還是覆蓋父類函數,均可以採用在子類中執行base.Fun()調用父類函數。
(三)重載發生在同一個類中同名不同型函數中。
(四)virtual函數可以執行,abstract類似於純虛函數(pure virtual)不可執行,必須聲明在抽象類中,否則編譯報錯;須在子類中實現纔可以執行,而且必須實現,否則編譯報錯。由於抽象類不可實例化,所以只能執行子類的函數定義。