一、純虛函數定義
純虛函數是在抽象類中定義的一個沒有實現的虛函數,需要派生類去實現。純虛函數通過 “= 0” 來表示。
class Base {
public:
virtual void doSomething() = 0;
};
上述代碼中,doSomething函數就是一個純虛函數。
二、抽象類
抽象類是含有純虛函數的類,不能實例化一個抽象類對象。一個抽象類可以被用來定義接口,其他的類可以繼承這個抽象類並實現這個接口。
class Shape {
public:
virtual void draw() = 0;
};
class Circle : public Shape {
public:
void draw() override {
// draw a circle here
}
};
class Square : public Shape {
public:
void draw() override {
// draw a square here
}
};
上述代碼中,Shape就是一個抽象類,Circle和Square是其派生類,實現了Shape定義的接口。
三、接口繼承
接口是指定義的一些函數,派生類必須實現這些函數才能被視為是該接口的實現。
class Resource {
public:
virtual void load() = 0;
virtual void save() = 0;
};
class File : public Resource {
public:
void load() override {
// load file here
}
void save() override {
// save file here
}
};
class NetworkResource : public Resource {
public:
void load() override {
// load network resource here
}
void save() override {
// save network resource here
}
};
上述代碼中,Resource類是一個接口,File和NetworkResource都是其派生類,實現了Resource定義的接口。
四、純虛析構函數
在使用指針進行多態時,通常我們需要將構造函數定義為虛函數,但是析構函數同樣需要這樣操作。在抽象基類中定義一個純虛析構函數來保證派生類中析構函數的正確執行。
class Base {
public:
virtual ~Base() = 0;
};
Base::~Base() {}
class Derived : public Base {
public:
~Derived() override {}
};
上述代碼中,Base類定義了一個純虛析構函數,Derived類是其派生類,實現了其析構函數。
五、多態性
多態性是面向對象程序設計的一個主要思想,意味着一個對象可以具有多種形態。利用純虛函數和抽象類,可以方便地實現多態性。
void doSomething(Resource& r) {
r.load();
r.save();
}
int main() {
File f;
NetworkResource n;
doSomething(f);
doSomething(n);
return 0;
}
上述代碼中,doSomething函數參數是一個Resource的引用,可以接受其派生類的對象傳遞。在main函數中通過調用doSomething函數實現了多態性的體現。
原創文章,作者:RHTIM,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/369338.html
微信掃一掃
支付寶掃一掃