“C++动态绑定”相关问题探讨
一、相关问题:
1. 基类、派生类的构造和析构顺序
2. 基类、派生类中virtual的取舍
二、测试代码:
#include <iostream>
class A {
public:
A() {
std::cout << "A()" << std::endl;
}
virtual void print() { std::cout << "A print()" << std::endl; }
virtual ~A() {
std::cout << "~A()" << std::endl;
}
};
class B : public A {
public:
B() : A(){
std::cout << "B()" << std::endl;
}
virtual void print() { std::cout << "B print()" << std::endl; }
virtual ~B() {
std::cout << "~B()" << std::endl;
}
};
void print() { }
int main(int argc, char *argv[])
{
A* c = new B();
c->print();
delete c;
return 0;
}
三、探讨与结论:
1. 基类、派生类的构造和析构顺序为:基类构造-派生类构造-派生类析构-基类析构
上述代码输出结果为:

2. 基类、派生类中virtual的取舍:若要实现动态绑定,基类中virtual关键字不可舍弃,派生类中virtual关键字可有可无;若基类中有关键字virtual,则普通函数调用派生类函数,析构函数先调用派生类,再调用基类;若基类中无关键字virtual,则普通函数和析构函数均只调用基类函数。
测试代码1:基类无关键字virtual
#include <iostream>
class A {
public:
A() {
std::cout << "A()" << std::endl;
}
void print() { std::cout << "A print()" << std::endl; }
~A() {
std::cout << "~A()" << std::endl;
}
};
class B : public A {
public:
B() : A(){
std::cout << "B()" << std::endl;
}
virtual void print() { std::cout << "B print()" << std::endl; }
virtual ~B() {
std::cout << "~B()" << std::endl;
}
};
void print() { }
int main(int argc, char *argv[])
{
A* c = new B();
c->print();
delete c;
return 0;
}
输出结果为:

测试代码2:派生类无关键字virtual
#include <iostream>
class A {
public:
A() {
std::cout << "A()" << std::endl;
}
virtual void print() { std::cout << "A print()" << std::endl; }
virtual ~A() {
std::cout << "~A()" << std::endl;
}
};
class B : public A {
public:
B() : A(){
std::cout << "B()" << std::endl;
}
void print() { std::cout << "B print()" << std::endl; }
~B() {
std::cout << "~B()" << std::endl;
}
};
void print() { }
int main(int argc, char *argv[])
{
A* c = new B();
c->print();
delete c;
return 0;
}
输出结果为:

“C++动态绑定”相关问题探讨的更多相关文章
- js日期格式转换的相关问题探讨
探讨问题1: 如何将 2017年8月22日 转换成 2017-8-22 / 2017-08-22呢 '2017年8月22日'.replace(/[年月日]/g,'-'); '2017年8月22日'.m ...
- TCP三次握手四次挥手相关问题探讨
TCP的握手挥手和状态转换是很多网络问题的基础.在此进行相关问题的讨论及记录. 首先,这幅图大致介绍了TCP连接和断开的过程: 注意其中的几个状态: LISTEN, SYN-SEND, SYN-RCV ...
- 土制Excel导入导出及相关问题探讨
转载请注明出处https://www.cnblogs.com/funnyzpc/p/10392085.html 新的一年,又一个开始,不见收获,却见年龄,好一个猪年,待我先来一首里尔克的诗: < ...
- c++中while(cin>>str)和ctrl z的相关问题探讨
对于while (cin>>str)和ctrl z的问题,网上有以下解释: -------------------------------------------------------- ...
- 成员函数指针,动态绑定(vc平台)
上一篇介绍了gcc对成员函数指针做了thunk的处理,本篇介绍vc对成员函数指针如何处理,还有动态绑定相关的处理. 同样用回上一篇的例子: struct point {float x,y;}; str ...
- 对象部分初始化:原理以及验证代码(双重检查锁与volatile相关)
对象部分初始化:原理以及验证代码(双重检查锁与volatile相关) 对象部分初始化被称为 Partially initialized objects / Partially constructed ...
- 大数据项目实践:基于hadoop+spark+mongodb+mysql+c#开发医院临床知识库系统
一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ...
- 玩转cocos2d-x lua-binding, 实现c++与lua混合编程
引言 城市精灵GO(http://csjl.teamtop3.com/)是一款基于cocos2d-x开发的LBS社交游戏, 通过真实地图的探索, 发现和抓捕隐匿于身边的野生精灵, 利用游戏中丰富的玩法 ...
- hadoop+spark+mongodb+mysql+c#
一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ...
随机推荐
- Eclipse环境开发Teamcenter RAC
外包发过来的RAC程序老是报错,导致测试走不下去.Bug修复响应太慢,用jad看了下代码也不是很复杂,决定自己调试.在Eclipse 环境下开发Teamcenter RAC一般是用Eclipse,在做 ...
- 612.1.004 ALGS4 | Elementary Sorts - 基础排序算法
sublime编辑器写代码,命令行编译 减少对ide的依赖//可以提示缺少什么依赖import 所有示例代码动手敲一遍 Graham's Scan是经典的计算几何算法 shffule 与 map-re ...
- node (1)
一.介绍 Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触角伸到了服务器端. 但Node似乎有点不同: ● Node.js不是一种独立的语言,与PHP. ...
- Unity Optimization UNITY优化关注列表
这里主要罗列Unity引擎进行开发的应用或游戏,可以进行优化的各个关注点.(此文会持续更新) C# GC alloc Update LateUpdate Serialize String ToStri ...
- ORACLE学习文档
转自 http://sparklet.blog.sohu.com/523655.html 数据库被分成一个或多个逻辑部件称作表空间.而表空间又被分成称作段(segment)的逻辑部件.这些段再细分就叫 ...
- AWS CSAA -- 02 AWS - 10000 Feet Overview
004 The History Of AWS So Far 005 AWS - 10000 Foot Overview 006 AWS - 10000 Foot Overview 007 AWS - ...
- Oracle存储过程_语法
create or replace procedure procedure_name --存储过程名字 ( --进行输入/输出的量 量_name in out 量_类型 --e.g. username ...
- [翻译] AFDropdownNotification
AFDropdownNotification Dropdown notification view for iOS. 下拉通知的view,用于iOS. Installation - 安装 If you ...
- 导出AD用户所属组,查询AD用户(aduser)
$ous="admin","bladmin","af","dd"for($i=0;$i -lt 2;$i++) { $o ...
- sonarQube环境搭建--常见问题及解决
环境配置:MySQL Server 5.7 Jdk1.8 1.安装mysql数据库(默认安装一路默认到底,注意不要先新建用户账号) a) Mysql 环境变量配置: b)新增my.ini文件: ...