#include <iostream> #include <vector> using namespace std; class Organisms { public: Organisms() { cout<<"Organisms constructor"<<endl; } ~Organisms() { cout<<"Organisms distructor"<<endl; } }; class Animal: public Organisms { public: Animal() { cout<<"Animal constructor"<<endl; } ~Animal() { cout<<"Animal distructor"<<endl; } }; class Person: public Animal { public: Person() { cout<<"Person constructor"<<endl; } ~Person() { cout<<"Person distructor"<<endl; } }; int main() { Animal* p = new Person; delete p; getchar(); return 0; }
结果是:
Organisms constructor
Animal constructor
Person constructor
Animal distructor
Organisms distructor
可以看出 创建实例时,构造函数调用顺序是: 基类的无参数构造函数--->子类无参数构造函数 (基->子)
而销毁对象时,析构函数调用顺序是: 子类无参数析构函数--->基类的无参数析构函数 (子->基)
但是如果销毁对象时是用基类类型指针,那么就不会调用子类的析构函数了,就像上面看到的结果,这就很有可能出问题。
从这里也可以看出,如果系统某个类可以被继承,请保证有无参数的构造函数。这两种情况都可以:
1. 不定义任何构造函数 (默认构函数就是无参数的)。
2. 自定义无参数构造函数。
事实上在c++中应该为任何类都应该提供无参数构造函数,这可是一个好习惯。
相关推荐
C++构造函数和析构函数的调用顺序举例一.调用方法和区别1、构造函数的调用顺序: 基类构造函数、对象成员构造函数、派生类本身的构造函数 2、析构函数的调用顺序:
先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下: 1.基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在...
C++ 语言一直被批评太复杂了,很多细节的地方需要仔细推敲,甚至其构造函数和析构的调用顺序也成为了一个让人迷惑的问题,在此我做了简单的总结。这篇文章主要介绍了C++中构造函数与析构函数的调用顺序,需要的朋友...
调用构造函数和析构函数的顺序:先构造的后析构,后构造的先折构。它相当于一个栈,先进后出。 代码如下:#include<iostream>#include<string>using namespace std;class Student{ public: Student(string,string,...
构造函数的调用可以追踪。。。。由于构造函数和析构函数都是自动吊桶的或者更不饿,我们可以自己设立函数来追踪构造函数的调用过称。
C++中的构造函数、析构函数剖析 在C+ + 中, 构造函数是一个在构件对象的时 候调用的特殊的函数, 其目的是对对象进行初始 化工作, 从而使对象被使用之前可以处于一种合 ...“构造函数”和“析构函数”的调用顺序
构造函数(constructor) 1.构造函数是种特殊的类成员函数,遵循如下规则: a.函数名与类名必须相同。...3.构造函数和普通成员函数不一样,一般不显示调用。在创建一个对象时,构造函数自动调用(编译器来完成
3、请设计一个拷贝构造函数,实现将参数的值全部传递给当前对象,同时输出“拷贝构造函数被调用” 4、请设计一个析构函数,同时输出“析构函数被调用” 5、设计一个成员函数 int dayDiff(CTime t) ,用于计算...
C++构造函数详解及显式调用构造函数.doc
构造与析构在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。 初始化对象的...
在Time类中增加拷贝构造函数的定义,主函数中调用该函数,运用调试工具跟踪,分析整个程序调用构造函数(包括拷贝构造函数)和析构函数的次数;再将f函数的形式参数分别修改为引用参数和指针参数(此时函数代码修改...
而继承包含了虚拟继承和普通继承,在可见性上分为public、protected、private。可见性继承比较简单,而虚拟继承对学习c++的难度较大。 首先,虚拟继承与普通继承的区别有: 假设derived 继承自base类,那么...
重载构造函数,调用成员函数,供C++初学者理解构造函数重载的概念
这是课上用的quiz,c++语法,关于什么情况下会调用什么构造函数
即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数。 下面看一个例子吧 代码如下:class c{public: c(){ printf(“c\n”); }protected:private:}; class b {public: b(){ printf(“b\n”);}...
C++的多态是通过虚表指针来实现的。但是在构造和析构函数中调用虚函数,情况如何呢?是否还能实现多态呢?本文档从内存角度揭示了这其中的多态实现过程。
问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使...
观察构造函数和析构函数的调用顺序。 (2)定义一个简单的Computer类,有数据成员芯片(CPU),内存(ram),光驱(cdrom)等等,有两个公有成员函数run、stopo,CPU为CPU类的一个对象,ram为RAM类的一个对象,cdrom为...
在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数、复制构造函数、复制赋值运算符和析构函数。这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构。也...