今天在寫純虛類的時候,遇到了兩個問題現在特意記錄下來,目的是以后好避免再犯
- 在寫純虛類的函數頭文件時候,聲明純虛函數的時候忘記標記"=0"
- “=0”這個操作在虛函數中有2層意思:
- 有的朋友誤解這是返回值為0的意思,但是它並不是,它僅表示的是這個是個純虛函數,是個抽象函數,沒有實現
- 這個類的繼承類里面必須要實現這個函數。
- “=0”這個操作在虛函數中有2層意思:
1 //animal.h 2 class Animal//這里的這個類他是個純虛類,不能被實例化 3 { 4 public: 5 Animal() {} 6 virtual void eat()=0;//這個函數沒有實現,但是在繼承類中必須要實現 7 } 8 9 class Animal 10 { 11 public: 12 Animal() {} 13 virtual void eat();//這個是普通的虛函數,有實現 14 }
- 當我們寫虛基類的時候,它的構造函數必須有實現:
- 首先我們要弄清楚構造函數的調用順序:從當前類往上找父類,一直找到最上層的父類,它是最先構造的,然后沿着繼承路徑依次往下構造,一直到當前類,也是就一句話:初始化基類的子對象,派生類的構造函數要調用基類的構造函數
1 //animal.h 2 class Animal 3 { 4 public: 5 Animal() {}//這里的這個類的構造函數我們需要實現,否則編譯報錯 6 virtual void eat()=0; 7 } 8 9 class Tiger:public Animal 10 { 11 public: 12 Tiger() {} 13 void eat override() { 14 qDebug()<<"delicious!!wow"; 15 } 16 }
- 當我們用delete釋放虛基類指針出錯。
- 首先我們得明白析構函數的調用順序:從當前類開始析構,析構完再沿着繼承路徑往上找父類 ,析構父類,再找到最上層的父類析構
- 所以這里我們必須要保證虛基類的析構函數必須要有虛析構函數:因為虛析構函數的主要作用是表明其析構操作全部由子類的析構函數來實現。
1 //animal.h 2 class Animal 3 { 4 public: 5 Animal() {}//這里的這個類的構造函數我們需要實現,否則編譯報錯 6 virtual ~Animal() {}//這里的這個類的析構函數必須標記virtual 7 virtual void eat()=0; 8 } 9 10 class Tiger:public Animal 11 { 12 public: 13 Tiger() {} 14 void eat override() { 15 qDebug()<<"delicious!!wow"; 16 } 17 } 18 19 //Client mian.cpp 20 int main(int argc, char *argv[]) 21 { 22 QCoreApplication a(argc, argv); 23 Animal* ani=new Tiger(); 24 ani->eat (); 25 delete ani;//如果上面析構函數不標記virtual,這里會報錯 26 }
以上筆記總結如有錯誤,請指正!謝謝