虛擬函數(shù)允許子類覆蓋基類的函數(shù),實現(xiàn)多態(tài)行為。它改變了對象模型,允許子類修改基類方法的實現(xiàn)。實戰(zhàn)案例中,shape 基類定義了 draw() 方法,而子類 rectangle 和 circle 覆蓋此方法以提供不同的繪制實現(xiàn)。好處包括多態(tài)性、代碼重用和設(shè)計靈活性。需要注意虛擬函數(shù)的運行時開銷、純虛函數(shù)的強制覆蓋以及靜態(tài)/動態(tài)綁定的謹(jǐn)慎使用。
C++ 虛擬函數(shù)與對象模型:深入理解面向?qū)ο笤O(shè)計
引言
虛擬函數(shù)是面向?qū)ο缶幊讨械年P(guān)鍵概念,它允許子類覆蓋基類的函數(shù),實現(xiàn)多態(tài)行為。理解虛擬函數(shù)及其與對象模型的關(guān)系對于掌握面向?qū)ο笤O(shè)計至關(guān)重要。
虛擬函數(shù)
虛擬函數(shù)是在基類中聲明并由子類覆蓋的成員函數(shù)。當(dāng)調(diào)用虛擬函數(shù)時,根據(jù)實際對象的類型而不是指向該對象的指針的類型,來調(diào)用覆蓋的函數(shù)。這使得子類可以提供自己的實現(xiàn),而不需要修改基類。
在 C++ 中,通過使用 virtual
關(guān)鍵字聲明虛擬函數(shù):
class Base { public: virtual void draw(); // 聲明虛擬函數(shù) };
登錄后復(fù)制
對象模型
對象模型定義了對象在程序中的布局和行為。對象由數(shù)據(jù)和方法組成,其中方法是綁定到對象數(shù)據(jù)上的函數(shù)。虛擬函數(shù)的引入改變了對象模型,因為它允許子類修改基類方法的實現(xiàn)。
實戰(zhàn)案例:圖形繪制
考慮一個圖形繪制應(yīng)用程序,其中有 Shape
基類和 Rectangle
和 Circle
子類。Shape
類定義了 draw()
方法,用于繪制形狀。子類覆蓋 draw()
方法以提供各自的繪制實現(xiàn)。
class Shape { public: virtual void draw() = 0; // 抽象基類,必須覆蓋 }; class Rectangle : public Shape { public: virtual void draw() override { // 繪制矩形 } }; class Circle : public Shape { public: virtual void draw() override { // 繪制圓形 } }; // 實例化子類并調(diào)用 draw() 函數(shù) Shape* rectangle = new Rectangle(); rectangle->draw(); // 調(diào)用 Rectangle 的 draw() 方法
登錄后復(fù)制
好處
多態(tài)性:子類可以實現(xiàn)自己版本的方法,而無需修改基類。
代碼重用:基類可以提供通用實現(xiàn),子類可以根據(jù)需要進(jìn)行擴展。
設(shè)計靈活性:允許在不影響基類的前提下更改子類的行為。
注意事項
虛擬函數(shù)會產(chǎn)生運行時開銷,因此不要過度使用它們。
純虛函數(shù)(用 = 0
聲明)必須在派生類中覆蓋,否則該類將變?yōu)槌橄箢悺?br />
應(yīng)小心使用靜態(tài)綁定和動態(tài)綁定(virtual 關(guān)鍵字),以避免對象切片和指針問題。