虚函数——virtual
来源:互联网 发布:美工需要哪些软件 编辑:程序博客网 时间:2024/06/10 19:34
virtual关键字很重要,它保证多态正常调用。下面例子Derived的getI方法并没有调用,而是调用了父类Base的getI方法,并且delete对象时也没有调用Derived的析构函数,这不是我们期望的。问题原因正上因为没有使用virtual关键字。Parent版本才是我们期望的正常结果。
纯虚函数是把Parent的getI方法赋值0,表明是抽象类,不能构造实例。
virtual int getI() = 0;
虚函数保证多态正常调用的原理,不属于本文章内容。本文的目的只是说明问题和虚函数的作用,调用原理将会新写一篇文章详细说明。
#include <iostream>using namespace std;#define LOG(x) cout << x << endl;class Base {int i;public:Base(int j):i(j){LOG("Base");}~Base(void){LOG("~Base");}int getI(){LOG("Base::getI() is called");return i;}};class Derived : public Base {int i;public:Derived(int j):Base(j) {LOG("Derived");}~Derived(void){LOG("~Derived");}int getI() {LOG("Derived::getI() is called");return i;}};class Parent {int i;public:Parent(int j):i(j){LOG("Parent");}virtual ~Parent(void){LOG("~Parent");}virtual int getI(){LOG("Parent::getI() is called");return i;}};class Child : public Parent {int i;public:Child(int j):Parent(j) {LOG("Child");}~Child(void){LOG("~Child");}int getI() {LOG("Child::getI() is called");return i;}};void main() {Base* a = new Derived(5);a->getI();delete a;Parent* b = new Child(8);b->getI();delete b;getchar();/* outputBaseDerivedBase::getI() is called~BaseParentChildChild::getI() is called~Child~Parent*/}
0 0
- 虚函数——virtual
- C++——中的虚函数(Virtual function)
- c++学习笔记——虚函数(virtual function)
- C++分析——多态与虚函数 virtual
- 虚函数 (virtual)
- virtual 虚函数
- virtual虚函数
- virtual虚函数
- 关于virtual虚函数
- C#虚函数virtual
- virtual纯虚函数
- Virtual members 虚函数
- c++ (virtual)虚函数
- 虚函数virtual
- virtual 虚函数
- virtual虚函数
- 虚函数 virtual
- virtual虚函数
- 注意Hibernate4在开发当中的一些改变
- PHP5.3.5如何连接MSSql Server
- Linux命令exit - 退出当前shell
- spring
- 文章标题显示图标的代码
- 虚函数——virtual
- 每天,每周,每月,每年程序员该做的事情
- 黑马程序员_java的IO流四_16
- MAC OS X 配置java开发环境
- C语言常用算法
- linux内核定时器使用及原理
- Java / Android 基于Http的多线程下载的实现
- struts2 路径问题
- Windows phone 8 单元测试(一)-- 环境搭建