C++纯虚函数与抽象类
生活随笔
收集整理的這篇文章主要介紹了
C++纯虚函数与抽象类
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
純虛函數(shù)
1.1純虛函數(shù)是在聲明虛函數(shù)時(shí)被“初始化”為0的函數(shù)。聲明純虛函數(shù)的一般形式為: virtual 函數(shù)類(lèi)型 函數(shù)名 (參數(shù)列表) =0; 如 virtual float area() const =0; 1.2純虛函數(shù)沒(méi)有函數(shù)體,而且這是一個(gè)聲明語(yǔ)句后面應(yīng)有分號(hào)。 1.3純虛函數(shù)最后面的“=0”并不表示返回值為0,它只是起形式上的作用,告訴編譯器這是純虛函數(shù)。 1.4純虛函數(shù)的作用是在基類(lèi)中為其派生類(lèi)保留一個(gè)函數(shù)的名字,以便派生類(lèi)型根據(jù)需要對(duì)它進(jìn)行定義。 1.5如果在一個(gè)類(lèi)中定義了純虛函數(shù),而在其派生類(lèi)中沒(méi)有對(duì)該函數(shù)定義,則該虛函數(shù)在派生類(lèi)中仍為純虛函數(shù)。抽象類(lèi)
1.1什么是抽象類(lèi)? 一種不用來(lái)定義對(duì)象而用來(lái)作為一種基本類(lèi)型而作為繼承的類(lèi),稱(chēng)為抽象類(lèi),由于它常作為基類(lèi),故又稱(chēng)為抽象基類(lèi)。 1.2凡是包含純虛函數(shù)的類(lèi)都是抽象類(lèi)。因?yàn)榧兲摵瘮?shù)是無(wú)法調(diào)用的,包含純虛函數(shù)的類(lèi)是無(wú)法建立對(duì)象的。 1.3往往一些好的面向?qū)ο蟮南到y(tǒng),其頂部是一個(gè)抽象類(lèi),甚至頂部有好幾層抽象類(lèi)。 1.4如果派生類(lèi)對(duì)基類(lèi)的所有純虛函數(shù)進(jìn)行了定義,那么這些函數(shù)就被賦予了功能,可以被調(diào)用,這個(gè)派生類(lèi)就不是抽象類(lèi),而是具體的類(lèi)。 1.5一段代碼: #include <iostream> using namespace std; class Shape { public: virtual float area() const{return 0;} virtual float volume() const{return 0;} virtual void shapeName() const=0; }; class Point:public Shape { public: Point(float a=0,float b=0); void setPoint(float a,float b); float getX() const {return x;} float getY() const {return y;} virtual void shapeName() const {cout << "Points" << endl;} friend ostream& operator << (ostream& output,Point& p); protected: float x,y; }; Point::Point(float a, float b) { x=a; y=b; } void Point::setPoint(float a, float b) { x=a; y=b; } ostream& operator << (ostream& output,Point& p) { output << "[" << p.getX() << "," << p.getY() << "]" << endl; return output; } class Circle:public Point { public: Circle(float a,float b,float r):Point(a,b),radius(r){} void setRadius(float r); float getRadius() const {return radius;} virtual float area() const ; virtual void ShapeName() const {cout << "Circle" << endl;} friend ostream& operator << (ostream& output,Circle &c); protected: float radius; }; void Circle::setRadius(float r) { radius=r; } float Circle::area() const { return 3.14159*radius*radius; } ostream& operator << (ostream& output,Circle &c) { output << "Center [" << c.x << "," << c.y << "] radius=" << c.radius << " area=" << c.area() << endl; return output; } class Cylinder:public Circle { public: Cylinder(float a,float b,float r,float h):Circle(a,b,r),height(h){} void setHeight(float h){height=h;} float getHeight() const{return height;} virtual float area() const; virtual float volume() const; virtual void ShapeName() const {cout << "Cylinder" << endl;} friend ostream& operator << (ostream& output,Cylinder& cy); protected: float height; }; float Cylinder::area() const { return 2*Circle::area()+2*3.14159*radius*height; } float Cylinder::volume() const { return Circle::area()*height; } ostream& operator << (ostream& output,Cylinder& cy) { output << "Center [" << cy.getX() << "," << cy.getY() << "] r=" << cy.radius << "\narea=" << cy.area() << " volume=" << cy.volume() << endl; return output; } int main() { Point p(1,2); Circle cir(1,2,3); Cylinder cy(1,2,3,4); cout <<"Cylinder\n" << "Center [" << cy.getX() << "," << cy.getY() << "] r=" << cy.getRadius() << "\narea=" << cy.area() << " volume=" << cy.volume() << endl; cy.setHeight(1); cy.setPoint(2,3); cy.setRadius(4); cout << "Cylinder\n" << cy << endl; Point &px=cy; cout << "Point\n" << px; Circle &c=cy; cout << "Circle\n" << c; Shape *pt=&p; pt->shapeName(); cout << "area=" << pt->area() << " volume=" << pt->volume() << endl; pt=○ pt->shapeName(); cout << "area=" << pt->area() << " volume=" << pt->volume() << endl; pt=&cy; pt->shapeName(); cout << "area=" << pt->area() << " volume=" << pt->volume() << endl; return 0; } 1.6一個(gè)基類(lèi)如果包括一個(gè)或一個(gè)以上的純虛函數(shù),就是抽象基類(lèi)。抽象基類(lèi)不能也不必要定義對(duì)象。 1.7抽象基類(lèi)與普通基類(lèi)不同,它一般不是現(xiàn)實(shí)存在的類(lèi)的抽象,它可以沒(méi)有任何物理意義上或其它實(shí)際意義方面上的含義。 1.8在類(lèi)的層次機(jī)構(gòu)中,頂層或最上面的幾層可以是抽象基類(lèi)。 1.9抽象基類(lèi)是本類(lèi)族的公共接口。 2.0區(qū)別靜態(tài)關(guān)聯(lián)和動(dòng)態(tài)關(guān)聯(lián)。 2.1如果在基類(lèi)聲明了虛函數(shù),則在派生類(lèi)中凡是與該函數(shù)有相同的函數(shù)名,函數(shù)類(lèi)型,參數(shù)個(gè)數(shù)與參數(shù)類(lèi)型的函數(shù),均為虛函數(shù)(不論在派生類(lèi)中是否用virtual聲明)。 2.2使用虛函數(shù)提高了函數(shù)的可擴(kuò)充性。總結(jié)
以上是生活随笔為你收集整理的C++纯虚函数与抽象类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: memcached client for
- 下一篇: C++三大继承与多级派生