虚函数被类的构造析构函数和成员函数调用虚函数的执行过程
#include<iostream>
class base{
public:
base()
{
std::cout<<std::endl;
std::cout<<"base constructor"<<std::endl;
func1();
std::cout<<std::endl;
}
virtual ~base()
{
std::cout<<std::endl;
std::cout<<"base distructor"<<std::endl;
func1();
std::cout<<std::endl;
}
virtual void func1()
{
std::cout<<"base virtural func1"<<std::endl;
}
void func2()
{
std::cout<<"base member func2"<<std::endl;
func1();
std::cout<<std::endl;
}
};
class derived:public base{
public:
derived()
{
std::cout<<std::endl;
std::cout<<"derived constructor"<<std::endl;
func1();
std::cout<<std::endl;
}
virtual ~derived()
{
std::cout<<std::endl;
std::cout<<"derived distructor"<<std::endl;
func1();
std::cout<<std::endl;
}
virtual void func1()
{
std::cout<<"derived virtual func1"<<std::endl;
}
};
int main()
{
base *point = new derived();
point->func2();
delete point;
return 0;
}
会有这样的输出
即使func1是虚函数,在base类和derived的构造函数和析构函数里面,都是调用自己类里面的func1。
而在普通成员函数func2调用func1,就会走虚函数的流程。
相关推荐
-
浅谈C++基类的析构函数为虚函数
1.原因: 在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类. 2.例子: (1). #include<iostream> using namespace std; class Base{ public: Base() {}; ~Base() {cout << "Output from the destructor of class Base!" << endl;}; void DoSomething() { cout
-
C++函数返回值为对象时,构造析构函数的执行细节
看如下代码: 复制代码 代码如下: #include<iostream>class TestConstructor{public: TestConstructor() { std::cout<<"TestConstructor()"<<std::endl; } ~TestConstructor() { std::cout<<"~TestConstructor()"
-
析构函数的作用 什么是析构函数
析构函数的作用是当对象生命期结束后,收回对象占用的资源,析构函数的特点是: 1.析构函数名是在类名前加以符号"~". 2.析构函数没有参数.返回类型和修饰符. 3.一个类中至多有一个析构函数,如果程序员没有定义析构函数,那么系统会自动地加入一个析构函数. 4.不能显式地调用析构函数,而是由系统自动调用. 定义析构函数格式为: ~类名() {...} 由于c#得到自动内存管理的支持,当对象生命期结束后,系统能够自动回收那些对象应该释放的资源等,所以一般不需要程序员的关心,对
-
深入解析C++中的构造函数和析构函数
构造函数:在类实例化对象时自动执行,对类中的数据进行初始化.构造函数可以从载,可以有多个,但是只能有一个缺省构造函数. 析构函数:在撤销对象占用的内存之前,进行一些操作的函数.析构函数不能被重载,只能有一个. 调用构造函数和析构函数的顺序:先构造的后析构,后构造的先折构.它相当于一个栈,先进后出. 复制代码 代码如下: #include<iostream>#include<string>using namespace std;class Student{ public: Stud
-
C++类成员构造函数和析构函数顺序示例详细讲解
对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象.C++遵循如下的创建顺序: (1)如果某个类具体基类,执行基类的默认构造函数. (2)类的非静态数据成员,按照声明的顺序创建. (3)执行该类的构造函数. 即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数. 下面看一个例子吧 复制代码 代码如下: class c{public: c(){ printf("c\n"); }protected:private:}; class b {pub
-
虚函数被类的构造析构函数和成员函数调用虚函数的执行过程
复制代码 代码如下: #include<iostream> class base{public: base() { std::cout<<std::endl; std::cout<<"base constructor"<<std::endl; func1(); std::cout<<std::endl; } virtual ~base() {
-
C++中的new/delete、构造/析构函数、dynamic_cast分析
1,new 关键字和 malloc 函数区别(自己.功能.应用): 1,new 关键字是 C++ 的一部分: 1,如果是 C++ 编译器,则肯定可以用 new 申请堆空间内存: 2,malloc 是由 C 库提供的函数: 1,如果没有相应的库,malloc 将不能使用: 2,有些特殊的嵌入式开发中,少了 C 库,则就不能动态内存分配: 3,new 以具体类型为单位进行内存分配: 1,面向对象中一般用 new,不用 malloc: 4,malloc 以字节为单位进行内存分配: 5,new 在申请内
-
C++类中的六大默认成员函数详解
在C++中,当你去创建一个类的时候,即便这个类是空类,也会自动生成下面6个默认成员函数,在本篇博客中,我将逐一分析下面6个默认成员函数. 构造函数 构造函数并不是去构造函数的函数,而是去对函数进行初始化的函数.构造函数的函数名与类名相同,当我们每次创建类对象的时候,就会自动调用构造函数.构造函数在对象的生命周期中只会调用1次. class Date { public: //构造函数 Date(int year = 2021, int month = 4, int day = 11) { _yea
-
C++类的构造与析构特点及作用详解
目录 一.类的构造函数 什么是构造函数 构造函数的特点 构造函数的作用 二.类的析构函数 什么是析构函数 析构函数的特点 小结 析构函数的作用 总结 构造函数 析构函数 一.类的构造函数 什么是构造函数 和类具有相同名称,并且没有返回值类型的函数,就是类的构造函数 概念模糊.直接举例: #include <stdio.h> #include <windows.h> struct Test { Test() // 和类具有相同的名.并且没有返回值 { } }; int main()
-
python利用dir函数查看类中所有成员函数示例代码
前言 如果一个类是别人编写的,又没有帮助文档,怎么样来查看所有成员函数呢?本文详细给大家介绍了关于python用dir函数查看类中所有成员函数的相关内容,下面话不多说了,来一起看看详细的介绍吧. 可以使用下面的代码: # File: builtin-dir-example-2.py class A: def a(self): pass def b(self): pass class B(A): def c(self): pass def d(self): pass def getmembers(
-
javascript一个判断浏览器类型的函数(类)
初学Javascript时写的一个判断浏览器类型的函数(类),不是很完善,不过毕竟第一次写东东,纪念一下! Get Exact Browser Type /*--------------------------------------------------------------- --this function can return the actual browser name and version.-- --USESAGE:There are Two Methods(See the e
-
解析VC中创建DLL,导出全局变量,函数和类的深入分析
一.创建DLL1.在VC中新建一个Win32空项目MathLib:2.添加预编译头文件stdafx.h,定义导入导出控制符号: 复制代码 代码如下: //stdafx.h#pragma once#define MATHLIB_EXPORT 3.添加包含要导出的全局变量,函数和类的头文件MathLib.h: 复制代码 代码如下: //MathLib.h #pragma once #ifdef MATHLIB_EXPORT #define MATHLIBAPI __declspec(dllexpor
-
浅谈Python类里的__init__方法函数,Python类的构造函数
如果某类里没有__init__方法函数,通过类名字创建的实例对象为空,切没有初始化:如果有此方法函数,通常作为类的第一个方法函数,有点像C++等语言里的构造函数. class Ca: def __init__(self, v): # 注意前后各两个下划线 self.name = v def pr(self): print "a--->", self.name ia = Ca("Jeapedu") # 本质调用的是__init__方法函数 ia.pr() Ca.
-
变量、函数、类的命名规则
1.命名要名副其实: 命名的时候一定要考虑他的显示意义和语境,不要认为把时间花费在变量的命名上很浪费.当然如果你程序很短的话,就不需要考虑那么多了,埋头就写代码.如果你的项目大,而且文件多的情况下,最好就是要花费时间在命名上,因为你的代码不仅仅只是你一个人看的. 2.避免误导: 也就是说不要把其他平台的关键字拿来命名,比如说我使用javascript语言,而我设计了一个变量为int,这让人会很头疼,为什么要一个int变量呢,难道这段代码是C++.这样就会让人产生误导.如果你想一个整型变量你可以这
-
python调用其他文件函数或类的示例
B.py调用A.py的函数或类 在同一个文件夹下 调用函数: A.py文件: def add(x,y): print('和为:%d'%(x+y)) B.py文件: import A A.add(1,2) 或 from A import add add(1,2) 调用类: A.py文件: class A: def __init__(self,xx,yy): self.x=xx self.y=yy def add(self): print("x和y的和为:%d"%(self.x+self.
随机推荐
- 探索ORACLE之ASM概念(完整版)
- 符合W3C Web标准的图片连续无间隙水平滚动
- php操作路径的经典方法(必看篇)
- PHP输出两个数字中间有多少个回文数的方法
- 超级好用的一个php上传图片类(随机名,缩略图,加水印)
- jsp防止跨域提交数据的具体实现
- JSP实现的简单分页显示效果代码
- 利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
- javascript实现五星评价代码(源码下载)
- Javascript学习笔记1 数据类型
- 轻松安装Red Hat 9.0
- C++ STL list 遍历删除出错解决方案
- java字符串切割实例学习(获取文件名)
- React从react-router路由上做登陆验证控制的方法
- JQuery获取元素尺寸、位置及页面滚动事件应用示例
- 易语言打开文件件网页的方法
- PHP基于timestamp和nonce实现的防止重放攻击方案分析
- Python中注释(多行注释和单行注释)的用法实例
- SSM+layUI 根据登录信息显示不同的页面方法
- flutter PositionedTransition实现缩放动画