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

结论:

构造

  1. 基类或类成员先执行构造函数
  2. 基类优先执行构造函数
  3. 类执行构造函数

析构

  1. 类先调用析构函数
  2. 类成员调用析构函数
  3. 基类调用析构函数
  4. 基类的成员调用析构函数

疑惑:

C++之父在<<C++程序语言设计1-3>>中说的顺序是成员构造函数在基类的构造函数调用之后

答疑:
	所谓成员构造函数在基类的构造函数之后,说的是派生类的成员
posted @ 2023-02-24 15:20  严_青  阅读(5)  评论(0编辑  收藏  举报