一、抽象類的概念與實現
抽象類是指在類中包含純虛函數(沒有實現代碼的函數),其目的是為了讓子類繼承並實現這些函數。抽象類不能被實例化,只能作為基類供子類繼承。
一個簡單的抽象類示例代碼如下:
class Shape { public: virtual double getArea() = 0; // 純虛函數,需要子類實現 virtual double getPerimeter() = 0; // 同上 };
上面的代碼定義了一個抽象類Shape,其中包含兩個純虛函數getArea和getPerimeter。由於這兩個函數沒有實現代碼,所以Shape類不能被實例化。具體實現需要在子類中完成。
二、抽象類的應用
1.實現多態
抽象類是多態的基礎,在抽象類中定義的純虛函數可以在子類中被重寫,從而實現多態。具體示例代碼如下:
class Circle : public Shape { public: Circle(double r): radius(r){} double getArea() { return 3.14 * radius * radius; } double getPerimeter() { return 3.14 * radius * 2; } private: double radius; }; class Rectangle : public Shape { public: Rectangle(double l, double w): length(l), width(w){} double getArea() { return length * width; } double getPerimeter() { return (length + width) * 2; } private: double length; double width; }; void printShape(Shape* s) { // 定義一個函數,以Shape類型指針為參數 cout << "Area: " <getArea() << endl; cout << "Perimeter: " <getPerimeter() << endl; }
上面的代碼實現了兩個子類Circle和Rectangle,它們都繼承了Shape抽象類並實現了其中的純虛函數getArea和getPerimeter。通過傳入Shape指針,可以調用printShape函數,打印出不同的子類實例的面積和周長。
2.防止重複代碼
抽象類可以作為公共代碼的集合,避免在多個類中重複編寫相同的代碼。例如,在網上商城中,電子產品、家電、食品等商品都需要添加到購物車中,而且每種商品的添加方法都是類似的。這時,可以定義一個抽象類Product,其中包含添加到購物車的方法,然後讓所有的商品類都繼承自Product,避免重複編碼。
三、接口的概念與實現
接口是純抽象類,其中只包含純虛函數,而且這些函數不包含任何實現代碼。接口主要用於描述類的功能行為(what)而非其實現方式(how)。
一個簡單的接口示例代碼如下:
class IShape { public: virtual double getArea() const = 0; virtual double getPerimeter() const = 0; };
上面的代碼定義了一個接口IShape,同樣包含兩個純虛函數getArea和getPerimeter。與抽象類的區別在於,接口的函數全部是純虛函數。
四、接口的應用
1.實現多態
接口同樣可以實現多態,具體實現方式與抽象類類似。示例代碼如下:
class Circle : public IShape { public: Circle(double r): radius(r){} double getArea() const { return 3.14 * radius * radius; } double getPerimeter() const { return 3.14 * radius * 2; } private: double radius; }; class Rectangle : public IShape { public: Rectangle(double l, double w): length(l), width(w){} double getArea() const { return length * width; } double getPerimeter() const { return (length + width) * 2; } private: double length; double width; }; void printIShape(const IShape& shape) { cout << "Area: " << shape.getArea() << endl; cout << "Perimeter: " << shape.getPerimeter() << endl; }
上面的代碼中,兩個子類Circle和Rectangle都繼承自IShape接口,並實現了其中的純虛函數。通過傳入IShape對象,可以調用printIShape函數,打印出不同的子類實例的面積和周長。
2.定義規範
接口可以定義規範,規定了函數的命名、返回值、參數等信息,使得項目組成員可以在遵守規範的前提下實現自己的代碼。在軟件工程中,定義規範是非常重要的,有利於代碼維護和後期開發。
總結
抽象類和接口都是C++中實現多態的重要方式,具備了很強的擴展性和靈活性。合理運用抽象類和接口可以避免代碼冗餘和提高代碼的可維護性。
原創文章,作者:VNIUN,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/324433.html