参考书籍:
《C++高级编程》(第4版)》
1.Composition(组合)关系下的构造和析构:


构造由内而外:
Container的构造函数首先调用Component的default构造函数,然后才执行自己。
Container::Container(...):Compnent() {...};
析构由外而内:
Container的析构函数首先执行自己,然后才调用Compnent的析构函数。
~Container::Container(...){~Component()};
测试:
Container:
//Container.h#ifndef GOUZHAOXIGOU_CONTAINER_H#define GOUZHAOXIGOU_CONTAINER_H#include <iostream>#include "Component.h"class Container {public:Container(){std::cout << "Container构造" << std::endl;}~Container(){std::cout << "Container析构" << std::endl;}private:Component m_component;};#endif //GOUZHAOXIGOU_CONTAINER_H
Component:
//Component.h#ifndef GOUZHAOXIGOU_COMPONENT_H#define GOUZHAOXIGOU_COMPONENT_H#include <iostream>class Component {public:Component(){std::cout << "Component构造" << std::endl;}~Component(){std::cout << "Component析构" << std::endl;}};#endif //GOUZHAOXIGOU_COMPONENT_H
main:
#include "Container.h"int main() {Container container;return 0;}
测试结果:

2.Inheritance(继承)关系下的构造和析构:


base class 的 dtor 必须是 virtual,否则会出现 undefined behavior
构造由内而外:
Derived的构造函数首先调用Base的default构造函数,然后才执行自己。
Derived::Derived(...):Base(){...};
析构由外而内:
Derived 的析构函数首先执行自己,然后才调用 Base 的析构函数。
Derived::~Derived(...){...~Base()};
测试:
Base:
//Base.h#ifndef GOUZHAOXIGOU_BASE_H#define GOUZHAOXIGOU_BASE_H#include <iostream>class Base {public:Base(){std::cout << "Base构造" << std::endl;}~Base(){std::cout << "Base析构" << std::endl;}};#endif //GOUZHAOXIGOU_BASE_H
Derived:
//Derived.h#ifndef GOUZHAOXIGOU_DERIVED_H#define GOUZHAOXIGOU_DERIVED_H#include "Base.h"class Derived : public Base{public:Derived(){std::cout << "Derived构造" << std::endl;}~Derived(){std::cout << "Derived析构" << std::endl;}};#endif //GOUZHAOXIGOU_DERIVED_H
main:
#include "Derived.h"int main() {Derived derived;return 0;}
测试结果:

3.Inheritance+Composition(继承+组合)关系下的构造和析构:


构造由内而外:
Derived的构造函数首先调用Base的default构造函数,然后调用Component的default构造函数,然后才执行自己。
Derived::Derived(...):Base(){...};
析构由外而内:
Derived的析构函数首先执行自己,然后调用Component的析构函数,然后才调用Base的析构函数。
Derived::~Derived(...)){...~Component(), ~Base()};
测试:
修改Derived:
//Derived.h#ifndef GOUZHAOXIGOU_DERIVED_H#define GOUZHAOXIGOU_DERIVED_H#include "Base.h"#include "Component.h"class Derived : public Base{public:Derived(){std::cout << "Derived构造" << std::endl;}~Derived(){std::cout << "Derived析构" << std::endl;}private:Component component;};#endif //GOUZHAOXIGOU_DERIVED_H
测试结果:

欢迎关注公众号:c_302888524
发送:"C++高级编程(第3版)" 获取电子书
文章转载自东拉西扯,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




