单一继承多次与多重继承的构造与析构

单一继承多次

代码:

class great_great_father
{
public:
    great_great_father()
    {
        cout << "function: \tgreat_great_father()" << std::endl;
    }
    ~great_great_father()
    {
        cout << "function: \t~great_great_father()" << std::endl;
    }
};

class great_father : public great_great_father
{
public:
    great_father()
    {
        cout << "function: \tgreat_father()" << std::endl;
    }
    ~great_father()
    {
        cout << "function: \t~great_father()" << std::endl;
    }
};

class father : public great_father
{
public:
    father()
    {
        cout << "function: \tfather()" << std::endl;
    }
    ~father()
    {
        cout << "function: \t~father()" << std::endl;
    }
};

class son : public father
{
public:
    son()
    {
        cout << "function: \tson()" << std::endl;
    }
    ~son()
    {
        cout << "function: \t~son()" << std::endl;
    }
};
int main(int argc, char *argv[])
{
    {
        son s;
    }

    system("pause");
    return 0;
}

son s;语句放在代码块里,使得析构放在主函数结束前。

类图如下

运行结果:

多重继承

代码:

class father1
{
public:
    father1()
    {
        cout << "function: \tfather1()" << std::endl;
    }
    ~father1()
    {
        cout << "function: \t~father1()" << std::endl;
    }
};

class father2
{
public:
    father2()
    {
        cout << "function: \tfather2()" << std::endl;
    }
    ~father2()
    {
        cout << "function: \t~father2()" << std::endl;
    }
};

class father3
{
public:
    father3()
    {
        cout << "function: \tfather3()" << std::endl;
    }
    ~father3()
    {
        cout << "function: \t~father3()" << std::endl;
    }
};

class son : public father1, public father2, public father3
{
public:
    son()
    {
        cout << "function: \tson()" << std::endl;
    }
    ~son()
    {
        cout << "function: \t~son()" << std::endl;
    }
};
int main(int argc, char *argv[])
{
    {
        son s;
    }

    system("pause");
    return 0;
}

类图:

运行结果:

编译器:Visual Studio 2015 -> cl.exe

实践很有意思!

时间: 2024-12-18 08:42:29

单一继承多次与多重继承的构造与析构的相关文章

C++多重继承的构造执行顺序

一个类,它可能有基类,也可能存在多个基类,这些类里面还可能是虚拟基类,并且在类的本身也可能存在对象成员.那么所涉及的这些类或对象成员会以什么样的顺序来调用它们各自的构造函数呢?今天我们就来举例分析下. 执行以下程序: #include <iostream> using namespace std; class Base{ public: Base(){ cout << "The constructor of Base" << endl; } }; c

C++ 类的继承三(继承中的构造与析构)

//继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类的构造函数 3.当父类的构造函数有参数时,需要在子类的初始化列表中显示调用 4.析构函数调用的先后顺序与构造函数相反 继承与其他类做成员变量混搭的情况下,构造和析构嗲用原则 1.先构造父类,在构造成员变量,最后构造自己 2.先析构自己,再析构成员变量,最后析构父类 */ clas

(原创)cocos2d-x 3.0+ lua 学习和工作(2) : 单一继承简单介绍

-- 星月相随倾心贡献~~~ -- 本章简单介绍一下:单一继承 -- 多继承本人还没有用过,主要是lua多继承感觉不好用~~~个人感觉~~~大汗~! -- example: local Base = class( "Base" ) Base.__index = Base function Base:ctor(...) print( self.__cname ) -- 输出:类名字.class( "xxx" ), self._cname 就是 xxx end func

第46课 继承中的构造与析构

1. 子类对象的构造 (1)子类中可以定义构造函数 (2)子类构造函数,必须对继承而来的成员进行初始化,有两种方式 ①直接通过初始化列表进行初始化或赋值的方式进行初始化 ②调用父类构造函数进行初始化 (3)父类构造函数在子类中调用方式 ①默认调用:适用于无参构造函数和使用默认参数的构造函数 ②显式调用:通过初始化列表进行调用,适用于所有父类构造函数 [编程实验]子类的构造初探 #include <iostream> #include <string> using namespace

iOS开发——swift篇&amp;Swift新特性(四)构造、析构、继承

构造.析构.继承 构造函数 在创建一个类型的实例的时候,构造函数中的参数需要写全参数名: struct Color { let red = 0.0, green = 0.0, blue = 0.0 init(red: Double, green: Double, blue: Double) { self.red = red self.green = green self.blue = blue } } let magenta = Color(red: 1.0, green: 0.0, blue:

C++--继承中的构造与析构、父子间的冲突

一.继承中的构造与析构 Q:如何初始化父类成员?父类构造函数与子类构造函数由什么关系?A.子类对象的构造1.子类在可以定义构造函数2.子类构造函数--必须对继承而来的成员进程初始化(直接通过初始化列表或者赋值的方式进行初始化,调用父类构造函数进行初始化)B.父类构造函数在子类中的调用方式1.默认调用--适用于无参构造函数和使用默认参数的构造函数2.显示调用--通过初始化列表进行调用,适用于所有父类构造函数代码示例 #include <iostream> #include <string&

C++--第16课 - 继承中的构造与析构

第16课 - 继承中的构造与析构 1. 赋值兼容性原则 (1)      子类对象可以当作父类对象使用. (2)      子类对象可以直接赋值给父类对象. (3)      子类对象可以直接初始化父类对象. (4)      父类指针可以直接指向子类对象. (5)      父类引用可以直接引用子类对象. 子类就是特殊的父类 #include <cstdlib> #include <iostream> using namespace std; class Parent { pro

继承的构造和析构

思考问题:如何初始化父类成员?父类构造函数和子类构造函数有什么关系呢? 子类对象的构造 子类中可方式以定义构造函数 子类构造函数必须对继承而来的成员进行初始化: 1)直接通过初始化列表或者赋值的方式进行初始化 2)调用父类构造函数进行初始化 父类构造函数在子类中的调用方式 默认调用:适用于无参构造函数和使用默认参数的构造函数 显示调用:通过初始化列表进行调用,适用于所有父类构造函数 如果子类没有显示调用,那么在父类中需要有无参构造函数 class Child : public Parent {

再探Delphi2010 Class的构造和析构顺序

发了上一篇博客.盒子上有朋友认为Class的构造和析构延迟加载.是在Unit的初始化后调用的Class的构造.在Unit的反初始化前调用的Class的析构函数. 为了证明一下我又做了个试验 unit Unit2; interface Type  TClassTest = class    class constructor create();    class destructor destory();  end; implementationuses  Windows; { TClassTes