簡單的繼承類
#ifndef virtualFuntion_hpp
#define virtualFuntion_hpp
#include <stdio.h>
class SValue {
public:
SValue() {
printf("SValue init\n");
};
~SValue() {
printf("SValue uninit\n");
}
};
class CValue {
public:
CValue() {
printf("CValue init\n");
};
~CValue() {
printf("CValue uninit\n");
}
};
class Shape{
public:
Shape(){
printf("Shape init\n");
};
virtual void draw() = 0;
virtual ~Shape(){
printf("Shape uninit \n");
};
private:
SValue _v;
};
class Cirle : Shape{
// using Shape::Shape;
public:
Cirle(){
printf("Cirle init\n");
};
virtual void draw() {
printf("Cirle draw cirle \n");
};
~Cirle() {
printf("Cirle uninit\n");
};
private:
CValue _v;
};
#endif /* virtualFuntion_hpp */
調用代碼
void test2(Shape *p) {
p->draw();
delete p;
}
int main()
{
Cirle * p = new Cirle();
test2((Shape*)p);
return 0;
}
//C++編譯器使用的Mac自帶的 apple clang
打印
SValue init
Shape init
CValue init
Cirle init
Cirle draw cirle
Cirle uninit
CValue uninit
Shape uninit
SValue uninit
結論:
構造
- 基類或類成員先執行構造函數
- 基類優先執行構造函數
- 類執行構造函數
析構
- 類先調用析構函數
- 類成員調用析構函數
- 基類調用析構函數
- 基類的成員調用析構函數
疑惑:
C++之父在<<C++程序語言設計1-3>>中說的順序是成員構造函數在基類的構造函數調用之後