您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言或C++中抽象類詳解及其作用介紹”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言或C++中抽象類詳解及其作用介紹”吧!
概述
抽象類 vs 具體類
案例
抽象類的作用
總結
抽象類 (abstract class), 是一些不用來定義對象, 而只作為基類被繼承的類. 由于抽象類常用作基類, 所以通常稱為抽象基類 (abstract base class).
定義抽象類的唯一目的, 就是去建立派生類. 我們在抽象類基礎上要定義出功能各異的派生類, 再用這些派生類去建立對象.
凡是包含純虛函數的類都是抽象類. 純虛函數不用實現, 故不能被調用, 抽象類無法建立對象. 抽象類的作用是作為一個類簇的共同基類, 即為一個類簇提供一個公共接口.
許多好的面向對象的系統, 其層次結構的頂部是一個抽象類, 甚至頂部有好幾層都是抽象類. 如果在抽象類所派生出的新類中對基類的所有純虛數進行了定義. 那么這些函數就被賦予了具體的功能, 可以被調用. 這個派生類就不是抽象類, 而是可以用來定義對象的具體類 (concrete class).
如果在派生類中每有對所有純函數進行定義, 則此派生類仍然是抽象類, 不能用來定義對象.
創建基類 Shape (形狀), 作為抽象類. Point (點), Circle (園) 是 Shape 類的直接派生類和間接派生類, Cylinder (圓柱體) 是 Shape 的間接派生類.
Shape 類:
#ifndef PROJECT6_SHAPE_H #define PROJECT6_SHAPE_H class Shape { public: virtual double area() const {return 0.0;} virtual double volume() const {return 0.0;} virtual void shapeName() const = 0; }; #endif //PROJECT6_SHAPE_H
Point:
#ifndef PROJECT6_POINT_H #define PROJECT6_POINT_H #include <iostream> #include "Shape.h" using namespace std; class Point : public Shape{ private: double a, b; public: Point(double p1, double p2) : a(p1), b(p2) {}; virtual void shapeName() const { // 對虛函數進行再定義 cout << "This is point with a = "<< a <<" b = " << b << endl; } }; #endif //PROJECT6_POINT_H
Circle:
#ifndef PROJECT6_CIRCLE_H #define PROJECT6_CIRCLE_H #include <iostream> #include "Shape.h" using namespace std; class Circle : public Shape{ protected: double r; public: Circle(double radius) : r(radius) {}; virtual void shapeName() const { // 對虛函數進行再定義 cout << "This is circle with r = "<< r << endl; } }; #endif //PROJECT6_CIRCLE_H
Cylinder 類:
#ifndef PROJECT6_CYLINDER_H #define PROJECT6_CYLINDER_H #include <iostream> #include "Circle.h" using namespace std; class Cylinder : public Circle{ private: double h; public: Cylinder(double r, double height) : Circle(r), h(height) {}; virtual void shapeName() const { // 對虛函數進行再定義 cout << "This is circle with r = "<< r << " h = " << h << endl << endl; } }; #endif //PROJECT6_CYLINDER_H
main:
#include <iostream> #include "Shape.h" #include "Point.h" #include "Circle.h" #include "Cylinder.h" using namespace std; int main() { // 創建對象 Point point1(1.2, 2.3); // 點對象 Circle circle1(2.5); // 圓對象 Cylinder cylinder1(3.5, 7); point1.shapeName(); circle1.shapeName(); cylinder1.shapeName(); Shape *pt; // 指向基類的指針 pt = &point1; pt->shapeName(); pt = &circle1; pt->shapeName(); pt = &cylinder1; pt->shapeName(); return 0; }
輸出結果:
This is point with a = 1.2 b = 2.3
This is circle with r = 2.5
This is circle with r = 3.5 h = 7This is point with a = 1.2 b = 2.3
This is circle with r = 2.5
This is circle with r = 3.5 h = 7
雖然說抽象類不能定義對象, 但是可以定義指向抽象類數據的指針變量. 當派生類稱為具體類之后, 就可以用這種指針指向派生類對象. 然后通過該指針調用虛函數, 實現多態性的操作.
抽象類接口是面向對象程序設計中的核心概念, 是各種設計模式中必需的機制.
一個基類如果包含一個或一個以上純虛函數, 就是抽象基類
抽象類不能也不必要定義對象
抽象基類與普通基類不同, 它不是現實存在的對象的抽象
在類的層次結構中, 頂層或最上面的幾層可以是抽象基類. 抽象基類體現了類族各類的共性, 把各類中共有的成員函數集中在抽象基類中聲明
抽象類是類族的公共接口
利用虛函數和多態性, 我們可以讓執行環境處理特殊性, 減少工作量和工作難度
感謝各位的閱讀,以上就是“C語言或C++中抽象類詳解及其作用介紹”的內容了,經過本文的學習后,相信大家對C語言或C++中抽象類詳解及其作用介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。