[源码下载]

不可或缺 Windows Native (23) - C++: 虚函数

作者:webabcd

介绍
不可或缺 Windows Native 之 C++

  • 虚函数

示例
1、基类
CppHuman.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
class CppHuman
{ protected:
string Name; public:
// 我是虚函数
virtual string Show(); // 我是纯虚函数(后面的“=0”只起形式上的作用,用于告诉编译器:“这是纯虚函数”)
// 纯虚函数只有声明,没有定义,其具体的功能是留给派生类定义的
// 凡是包含纯虚函数的类都是抽象类,抽象类是无法实例化的,因为纯虚函数是不能被调用的
// virtual string Display() = 0; CppHuman(string name); // 我是 virtual 的析构函数
virtual ~CppHuman(); };
}

CppHuman.cpp

/*
* 基类
*/ #include "pch.h"
#include "CppHuman.h"
#include "cppHelper.h" using namespace NativeDll; string CppHuman::Show()
{
return "human: " + Name;
} CppHuman::CppHuman(string name) : Name(name)
{ } CppHuman::~CppHuman()
{ }

2、派生类
CppChild.h

#pragma once 

#include <string>
#include "CppHuman.h" using namespace std; namespace NativeDll
{
class CppChild : public CppHuman
{ public:
// 由于基类 CppHuman 的 Show() 函数是虚函数,所以其所有直接或间接派生类中,如果声明了此函数则均为虚函数(virtual 可以省略)
virtual string Show(); CppChild(string name); ~CppChild(); };
}

CppChild.cpp

/*
* 派生类(基类是 CppHuman)
*/ #include "pch.h"
#include "CppChild.h"
#include "cppHelper.h" using namespace NativeDll; string CppChild::Show()
{
return "child: " + Name;
} CppChild::CppChild(string name) : CppHuman(name)
{ } CppChild::~CppChild()
{ }

3、示例
CppClass7.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
class CppClass7
{
public:
string Demo();
};
}

CppClass7.cpp

/*
* 虚函数
*/ #include "pch.h"
#include "CppClass7.h"
#include "CppChild.h" using namespace NativeDll; void cppclass7_demo1();
void cppclass7_demo2(); string CppClass7::Demo()
{
// 虚函数
cppclass7_demo1(); // virtual 的析构函数
cppclass7_demo2(); return "看代码及注释吧";
} // 虚函数
void cppclass7_demo1()
{
// 不使用虚函数的示例:参见 CppClass5.cpp 中的“基类与派生类的转换” // 以下演示了如何使用虚基类
CppHuman human("webabcd");
CppChild child("diandian"); // 指针指向基类,调用虚函数后执行的是基类的虚函数
CppHuman *humanPointer = &human;
string result = humanPointer->Show(); // human: webabcd // 指向基类的指针改为指向派生类,调用虚函数后执行的是派生类的虚函数
humanPointer = &child;
result = humanPointer->Show(); // child: diandian // 像上面这种方式是在程序运行阶段把虚函数和类对象“绑定”在一起的,因此此过程称为动态关联(dynamic binding)或滞后关联(late binding),其属于动态多态性
// 如果使用了虚函数,则编译器会为该类构造一个虚函数表(virtual function table,简称 vtable),它是一个指针数组,存放每个虚函数的入口地址,据此可做静态关联和动态关联
} // virtual 的析构函数
void cppclass7_demo2()
{
// 一般来说,清理派生类时,会先调用派生类的析构函数,然后调用基类的析构函数
// 但是下面这种情况例外
CppHuman *pt = new CppChild("diandian");
delete pt;
// 此时,如果基类的析构函数不是 virtual 的,则只会执行基类的析构函数
// 此时,如果基类的析构函数是 virtual 的,则会先执行派生类的析构函数,再执行基类的析构函数
// 所以,最好把基类的析构函数声明为虚函数(其会使所有派生类的析构函数都自动变为虚函数),以避免清理不彻底
}

OK
[源码下载]

不可或缺 Windows Native (23) - C++: 虚函数的更多相关文章

  1. 不可或缺 Windows Native (20) - C++: 友元函数, 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

  2. 不可或缺 Windows Native (6) - C 语言: 函数

    [源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...

  3. 不可或缺 Windows Native 系列文章索引

    [源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...

  4. 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类

    [源码下载] 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1 ...

  5. 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

    [源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...

  6. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  7. 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

  8. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  9. 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

    [源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...

随机推荐

  1. osgi dm

    看了http://developer.51cto.com/art/200909/154863.htm 真心感到,最强大最有组织的技术网站还是 51cto,牛人应该也是最多的. 以前逛51cto的比较少 ...

  2. 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

    返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...

  3. MVVM架构~knockoutjs系列之验证信息自定义输出

    返回目录 这个文章非常重要,也是非常必要的,在我们进行项目开发时,后台无所谓,对样式无要求,而网站前台来说,对样式要求严格,你的验证信息都是前台设计好的,所以,不能使用knockoutjs自带的了,我 ...

  4. Java的String字符串内容总结

    String--字符串 获取字符串的长度 使用Sring类的length()方法可获取字符串对象的长度,例: str.length(); str代表指定的字符串对象;返回值为返回指定字符串的长度.例: ...

  5. CAR

    24.编写一个Car类,具有String类型的属性品牌,具有功能drive: 定义其子类Aodi和Benchi,具有属性:价格.型号:具有功能:变速: 定义主类E,在其main方法中分别创建Aodi和 ...

  6. [数据库连接池] Java数据库连接池--DBCP浅析.

    前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务 ...

  7. Atitti 跨语言异常的转换抛出 java js

    Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...

  8. jQuery_03之事件、动画、类数组操作

    一.事件: 1.模式触发事件:  ①DOM:elem.onXXX();只能触发直接用onXXX绑定的事件处理函数:用addEventistener添加的事件监听无法模拟出发触发:  ②jQuery:$ ...

  9. ASPNET_WEBAPI快速学习02

    这部分内容的学习,已经放了大半年时间了,果断补充上,尽早将过去遗留的老技术坑都补上.首先将介绍服务幂等性的概念和相关解决方案,这部分也将是本文的理解难点,由于WebAPI是一种Restful风格服务的 ...

  10. 使用Source Safe for SQL Server解决数据库版本管理问题

    简介     在软件开发过程中,版本控制是一个广为人知的概念.因为一个项目可能会需要不同角色人员的参与,通过使用版本控制软件,可以使得项目中不同角色的人并行参与到项目当中.源代码控制使得代码可以存在多 ...