C++中虚继承的构造(construct)和析构(destruct)顺序

虚继承(virtual inheritance)的构造(construct)和析构(destruct)顺序

在多重继承的时候, 构造顺序是 虚继承按顺序优先, 再次是其他按顺序, 由基类至派生类; 析构顺序正好相反;

代码如下:

/*
 * cppprimer.cpp
 *
 *  Created on: 2014.1.10
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <string>  

class ZooAnimal {
public:
    ZooAnimal () {
        std::cout << "ZooAnimal Constructor!" << std::endl;
    }
    void zooprint (void) { std::cout << "Zoo Animal!" << std::endl; }
};  

class Bear : public virtual  ZooAnimal {
public:
    Bear (){
        std::cout << "Bear Constructor!" << std::endl;
    }
    void bearprint (void) { std::cout << "Bear!" << std::endl; }
};  

class Character {
public:
    Character () {
        std::cout << "Character Constructor!" << std::endl;
    }
};  

class BookCharacter : public Character {
public:
    BookCharacter () {
        std::cout << "BookCharacter Constructor!" << std::endl;
    }
};  

class ToyAnimal {
public:
    ToyAnimal () {
        std::cout << "ToyAnimal Constructor!" << std::endl;
    }
};  

class TeddyBear : public BookCharacter, public Bear,
                                public virtual ToyAnimal
{
public:
    TeddyBear () {
        std::cout << "TeddyBear Constructor!" << std::endl;
    }
};  

int main (void)
{
    TeddyBear TB;
}

输出:

ZooAnimal Constructor!
ToyAnimal Constructor!
Character Constructor!
BookCharacter Constructor!
Bear Constructor!
TeddyBear Constructor!

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, include
, 顺序
, construct
, 多重
Inheritance
construct destruct、析构函数 继承、c 多继承 析构函数、c 继承 析构函数、php construct 继承,以便于您获取更多的相关知识。

时间: 2024-11-05 00:14:21

C++中虚继承的构造(construct)和析构(destruct)顺序的相关文章

C++多重继承与虚继承分析_C 语言

本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下: 一.多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分.同样的,在多重继承(multiple inheritance)关系中,派生类的对象包含了每个基类的子对象和自定义成员的子对象.下面是一个多重继承关系图: class A{ /* */ }; class B{ /* */ }; class C : public A { /* */ }

C++中如何在容器中使用继承和虚函数

容器不支持混合类型, 如果直接把派生类对象, 存入基类容器中, 则无法使用派生-基转换(derived-base conversion); 因为转换只能发生在指针和引用 过程中, 不能发生在 对象直接赋值, 如果是直接转换, 则会产生截断(sliced down); 即派生类部分被切除, 只留下基类部分; 所以存入容器中的派生类 输出为基类部分 的虚函数; 如果想在容器中, 进行继承, 则需要使用指针, 包括智能指针(如:shared_ptr<>), 则会输出派生类的覆写(override)版

C++中的虚继承(virtual inheritance)

虚继承主要是避免基类重复被继承, 包含多个相同基类, 导致歧义性, 使用虚基类(virtual base class)继承, 可以使派生对象只包含一份基类文件. 如果不使用虚继承, 则派生类需要提供一份自己的示例版本, 参见: http://blog.csdn.net/caroline_wendy/article/details/18077235 代码: /* * cppprimer.cpp * * Created on: 2014.1.10 * Author: Spike */ /*eclip

C++中virtual继承的深入理解_C 语言

今天专门看了一下虚继承的东西,以前都没怎么用过,具体如下:父类:  复制代码 代码如下: class   CParent { .... }; 继承类的声明比较特别: class   CChild   :   virtual   public   CParent { .... }  请问,这个"virtual"是什么作用及含义? --------------------------------------------------------------- 表示虚拟继承,和普通继承是C++

C++对象布局及多态探索之菱形结构虚继承

这次我们看看菱形结构的虚继承.虚继承的引入本就是为了解决复杂结构的继承体系问题.上一篇我们在讨论虚继承时用的是一个简单的继承结构,只是为了打个铺垫. 我们先看看这几个类,这是一个典型的菱形继承结构.C100和C101通过虚继承共享同一个父类C041.C110则从C100和C101多重继承而来. struct C041{ C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_;};struct C100 : public vir

C#类中虚方法相互调用的潜在重载错误

错误    当我们编写基类虚方法时,需要注意一个问题,就是基类中虚方法的相互调用,有可能引起派生类重载时的潜在错误隐患.当然这个错误并不是C#语言设计的缺陷,而是一个不可避免的实现而已.当然如果我们是要编写通用的组建基类,就需要注意一下了.     或许我们刚开始做OOP的时候,对于有没有方法有没有virtual根本不在乎,很多是时候我们都重写了(rewrite)了基类方法.当然在需要确定重载(override)的时候,virtual关键字限定基类方法是不可少的.那么是不时我们就可以把基类的方法

C++中的继承(inheritance) 和动态绑定(dynamic binding) 简介

继承(inheritance)和动态绑定(dynamic binding) 是面向对象的重要组成部分, 即继承(inheritance)和多态(polymorphism), 可以使 派生类(derived class)拥有 基类(base class) 的接口(interface); 派生类可以覆写(override)基类的虚函数(virtual function), 符合特定的功能; 派生类可以隐式地转换为基类 (derived-to-base conversion), 但不可逆, 因为派生类

C++中派生类的构造和析构顺序详解

派生类因为要调用基类, 所以构造和析构都是按照一定顺序进行; 构造的顺序是: 基(base) -> 派生(derived);即先构造基类, 再构造派生类; 因为 基类 是独立于派生类的, 即不会调用派生类中的对象, 所以应该先被生成; 如果派生类先于基类生成, 则因为无法调用基类资源, 可能生成失败; 析构的顺序是: 派生(derived) -> 基(base); 即先释放派生类, 再释放基类; 因为 派生类 需要先释放调用的基类资源, 所以应该优先释放; 如果基类先析构, 则有可能某些资源被

C++:虚继承(virtual inheritance) 详解

在多重继承(multiple inheritance)中, 可能出现多个基类继承自同一个基类, 即"菱形继承", 会导致最顶层的基类, 被复制多次; 可以采用虚继承(virtual inheritance)的方式, 使派生类(derived class)只保留最顶层基类的一个副本. virtual, 即需要vptr(virtual table pointer), 即虚表指针, 额外占用4个字节; 代码如下: /* * test.cpp * * Created on: 2014.04.1