- 浏览: 32581 次
- 性别:
- 来自: 南京
文章分类
最新评论
#include <iostream> using namespace std; class base { public: virtual void f1(){ cout<<"f1 of base"<<endl; } ~base(){ cout<<"destructor base"<<endl; } }; class derive:public base { public: void f1(){ cout<<"f1 of derive"<<endl; } ~ derive(){ cout<<"destructor derive"<<endl; } }; int main(){ base * pb1 = new base; //声明基类型的指针,指向实际的基类型对象 base * pb2 = new derive; //声明基类型的指针,指向实际的子类型对象 pb1->f1(); //调用虚函数 delete pb1; //删除对象(调用析构函数) pb2->f1(); //调用虚函数 delete pb2; //删除对象(调用析构函数) }
输出为:
f1 of base
destructor base
f1 of derive
destructor base
说明:
只要将基类的函数设置为虚函数,那么所有覆盖它的子类的函数也都是虚函数,而不需要再使用virtual关键字声明了。
调用虚函数f1时,使用的是动态联编,它是根据运行时pb1,pb2指针所指向的对象的实际类型来调用函数。
调用析构函数时,由于它不是虚函数,采用的是静态联编,它是根据指针pb1,pb2的声明类型来调用函数的。
解决这个问题的方法是将base类的析构函数声明为virtual。
发表评论
-
C++强制类型转换
2010-09-29 23:50 828C++同时提供了四种新的 ... -
拷贝构造函数和赋值函数
2010-09-29 20:04 844-- C++中拷贝构造函数被调用的三种情形 1) 一个对象 ... -
构造函数和析构函数
2010-09-29 19:17 668-- 析构函数可以为virtual类型,而构造函数则不能。构造 ... -
sizeof相关问题
2010-09-29 17:07 7121. sizeof的概念: sizeof是C的一种单目运 ... -
scanf
2010-09-29 10:57 638scanf -
定义&赋值&初始化
2010-09-18 23:26 785定义一个变量,就是分配一块存储空间并给它命名; 给一个变量赋值 ... -
“连接”相关细节
2010-09-18 19:42 632在一个执行程序中,标识符代表存放变量或者被编译过的 ... -
内联函数
2010-09-18 17:12 824在C++中,宏的概念是作为内联函数来实现的。 ... -
C++虚函数机制
2010-09-18 15:29 1105典型的编译器 ... -
引用的相关重点
2010-09-18 15:15 628引用的主要用途是为了描述函数的参数和返回值,特别是 ... -
虚继承的构造函数调用问题
2010-09-18 14:27 2226在某一个虚基类的任何 ... -
static在不同地方的含义
2010-09-18 13:52 8661. 源文件中定义函数使用的static表示的是访问权限:只有 ... -
头文件中的名字空间
2010-09-18 13:41 751不要在头文件中放置使用指令,使用指令的通常形式是: using ... -
为什么不能通过返回值重载
2010-09-18 13:33 1161为什么只能通过范围和参数来重载,而不能通过返回值呢? ... -
编译C程序的详细过程
2010-09-16 00:04 731编译的概念:编译程序 ... -
标准I/O库
2010-09-15 23:58 645标准I/O库及其头文件stdio.h为底层I/O系统提供了一个 ...
相关推荐
这种技术与静态联编形成对比,后者在编译时就已经确定了函数调用。在C++中,多态性使得程序员可以设计通用的代码,这些代码能够处理不同类型的对象,而无需知道这些对象的具体实现细节。 静态联编是C语言的主要特点...
C++虚函数与静态动态联编个人理解
根据联编发生的时机,可以分为静态联编(static binding)和动态联编(dynamic binding)。 **静态联编** 静态联编在编译期间就已经完成,即编译器在编译阶段就能确定函数的调用。这意味着,当一个函数通过指针或...
### 动态联编与静态联编 #### 一、联编的概念 在计算机编程领域,特别是面向对象语言中,**联编**是指一个程序的不同部分如何被连接在一起的过程。根据联编发生的时机,可以将其分为两大类:静态联编和动态联编。 ...
根据联编的时间点,可以分为静态联编和动态联编。 静态联编,也称为早期联编,发生在程序的编译和链接阶段。在编译期间,编译器就能确定函数调用的具体实现,从而建立起调用与实现之间的直接关联。这意味着,当一个...
1. 动态联编与静态联编的区别在于,动态联编是在运行时确定调用的函数,而静态联编(也称为早期联编)则在编译时确定。动态联编需要通过指向对象的指针或对象引用来调用虚函数,或者在成员函数内部调用虚函数。 2. ...
按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。 静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要...
在C++编程语言中,虚函数、多态和动态联编是面向对象编程的重要特性,它们使得程序设计更加灵活,能够实现抽象和代码复用。虚函数是实现多态的关键机制,它允许我们通过父类指针或引用调用子类重写的方法,从而达到...
多态性可以分为两种主要类型:静态联编(Static Binding)和动态联编(Dynamic Binding)。本讲解将深入探讨这两种联编方式,以及虚函数(Virtual Function)、纯虚函数(Pure Virtual Function)和虚析构函数...
#### 三、虚函数、动态联编与静态联编 在面向对象编程中,多态性是一种非常重要的特性,它允许我们使用基类类型的指针或引用指向派生类对象,并调用派生类中的重写方法。实现多态性的关键机制之一就是虚函数。 **...
11. **动态联编与静态联编**: JavaScript的动态联编允许在运行时检查对象引用,而Java的静态联编要求编译时确定对象类型,提供更强的类型检查。 学习JavaScript的第一步通常是编写简单的“Hello, World”程序,如...
#### 八、数组的动态联编与静态联编 **数组的动态联编**和**静态联编**是指数组大小的确定时机。 - **动态联编**: 数组大小在运行时确定。 - **静态联编**: 数组大小在编译时确定。 - **示例**: 使用`const int`...
1. 动态联编与虚函数的关系: - 动态联编通常在运行时执行,与编译时的静态联编相对。它是通过虚函数实现的。 - 虚函数是类中的非静态成员函数,它允许子类重写基类的行为。 - 没有虚函数,就不能实现基于对象...
熟练掌握静态联编和动态联编的概念和用法 掌握纯虚函数和抽象类的概念和用法 实验内容 声明一个抽象类Shape,由它派生出3个类:Circle(圆),Rectangle(矩形)、Triangle(三角形),用函数分别输出以上三个图形的周长和...
【Qt与Halcon联编程序打包】涉及到的是在软件开发中如何将Qt应用程序与Halcon机器视觉库结合,并且将整个程序打包成可执行文件,以便于用户在没有开发环境的计算机上运行。Qt是一个跨平台的应用程序开发框架,而...
C++支持两种联编方式:静态联编和动态联编。静态联编是在程序被编译时进行的,而动态联编是在程序运行时进行的。动态联编是C++实现运行时多态性的关键因素。 本文档还提供了一个示例程序,演示了如何使用虚函数来...
1. 动态联编与虚函数: - 虚函数是动态联编的基础,它允许在运行时动态决定调用哪个函数。 - 动态联编不是在编译时确定操作函数,而是在运行时根据对象的实际类型确定。 - 为了实现动态联编,类之间需要满足子...