一、public繼承的定義
public繼承是C++中最常見的繼承方式之一。它的定義方式如下:
class DerivedClass : public BaseClass { ... };
這樣定義後,DerivedClass就會從BaseClass中繼承所有public成員,而BaseClass中的protected和private成員則不能被DerivedClass訪問。
二、public繼承的實現方式
public繼承的實現方式是通過在DerivedClass類中包含一個BaseClass對象來實現的:
class BaseClass { public: ... }; class DerivedClass : public BaseClass { public: ... private: BaseClass m_base; };
這裡m_base是DerivedClass類中的成員變量,它是由BaseClass類實例化而來的,因此DerivedClass類就可以訪問BaseClass中的所有public成員。
三、public繼承的用途
1. 代碼復用
public繼承最常見的用途就是為了代碼復用。如果DerivedClass需要重用BaseClass中的代碼(公共接口),那麼可以通過public繼承來實現。
例如:
class Shape { public: virtual int GetArea() = 0; virtual int GetPerimeter() = 0; }; class Rectangle : public Shape { public: Rectangle(int width, int height) : m_width(width), m_height(height) {} int GetArea() override { return m_width * m_height; } int GetPerimeter() override { return 2 * (m_width + m_height); } private: int m_width, m_height; }; class Square : public Rectangle { public: Square(int sideLength) : Rectangle(sideLength, sideLength) {} };
這裡Rectangle類是一個具體的實現類,Square類則是一個將Rectangle類進行擴展的類。由於Square類也是一個矩形,所以可以通過public繼承Rectangle類來獲取Rectangle類中的代碼,直接使用Rectangle中的函數GetArea()和GetPerimeter(),而不需要再次實現這些代碼。
2. 多態性
public繼承還可以用於實現多態性。
例如:
class Animal { public: virtual void Speak() {} }; class Cat : public Animal { public: void Speak() override { std::cout << "Meow" << std::endl; } }; class Dog : public Animal { public: void Speak() override { std::cout << "Woof" << std::endl; } }; void DoSpeak(Animal& animal) { animal.Speak(); } int main() { Cat cat; Dog dog; DoSpeak(cat); DoSpeak(dog); return 0; }
這裡Animal類是一個抽象基類,它中包含了一個Speak()虛函數。Cat和Dog類通過public繼承Animal類來實現多態性,重寫了Animal中的Speak()函數。
在main()函數中,我們創建了一個Cat對象和一個Dog對象,然後將這兩個對象分別傳遞給DoSpeak()函數。由於DoSpeak()函數的參數是Animal的引用,因此cat和dog對象都被作為Animal類型的參數進行了傳遞。在運行過程中,程序會調用cat和dog的Speak()方法,分別輸出Meow和Woof。
3. 接口分離原則
public繼承還可以用來實現接口分離原則。接口分離原則指的是,一個接口應該只包含其子類所需要的所有方法和屬性,而不應該包含其子類不需要的內容。基於這個原則,我們可以定義多個接口,每個接口代表一種特定的行為,然後在子類中使用public繼承來實現多個接口的組合。
例如:
class IReader { public: virtual std::string Read() = 0; }; class IWriter { public: virtual void Write(const std::string& data) = 0; }; class IProcessor { public: virtual void Process() = 0; }; class DataProcessor : public IReader, public IWriter, public IProcessor { public: std::string Read() override { /* implementation */ } void Write(const std::string& data) override { /* implementation */ } void Process() override { /* implementation */ } };
這裡我們定義了三個接口:IReader、IWriter和IProcessor。DataProcessor類通過public繼承這三個接口,來實現多個接口的組合。
四、結論
public繼承是C++中最常見的繼承方式之一,它通過在派生類中包含一個基類對象的方式來實現繼承。public繼承的用途包括代碼復用、實現多態性和實現接口分離原則,可以大大提高代碼復用性和可維護性。然而,需要注意的是,過度使用public繼承可能會導致子類和基類之間產生過於緊密的耦合,降低代碼的可擴展性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/185303.html