C++ 类的构造与析构
简单的继承类
#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 */
继承关系
Circle -> Shape
析构函数调用原则
成员和基类的析构函数被派生类的析构函数(无论是用户定义的还是编译器生成的)隐式调用
调用代码
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>>中说的顺序是成员构造函数在基类的构造函数调用之后
答疑:
所谓成员构造函数在基类的构造函数之后,说的是派生类的成员
本文来自博客园,作者:严_青,转载请注明原文链接:https://www.cnblogs.com/zhao-jie-li/articles/17151570.html