[源码下载]

不可或缺 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. Azure China (9) 在Azure China配置CDN服务

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China Update 2015-11-20:Azure China CDN服 ...

  2. Linux网路编程系列-网络I/O模型

    应用程序从网络中拿数据,要经历两个阶段:1.等待数据准备好-分组到达,被拷贝到内核缓冲区,组装数据报:2.数据从内核缓冲区拷贝至用户态应用程序的缓冲区.Unix下五个I/O模型: 阻塞I/O: 进程调 ...

  3. EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!

    回到目录 Entityframeworks很聪明 不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在lin ...

  4. 关于STM32的外部引脚中断的问题

    今天想用自己以前的比较干净的工程模板做一个东西,,,,,,,在添加上引脚中断的时候,,突然想知道自己配置的中断优先级是否正确执行,,,,, 以前刚学习32的时候测试过是可以的,,不过今天发现了一个大问 ...

  5. lua的私有性(privacy)

    很多人认为私有性是面向对象语言的应有的一部分.每个对象的状态应该是这个对象自己的事情.在一些面向对象的语言中,比如C++和Java你可以控制对象成员变量或者成员方法是否私有.其他一些语言比如Small ...

  6. [Linux]Linux下redis的安装及配置.

    在上一篇[Linux] linux下安装配置 zookeeper/redis/solr/tomcat/IK分词器 详细实例. 我们已经将redis所需tar包拷贝到了linux下的root 根目录下, ...

  7. Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)

    Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...

  8. [java] 找出字符串中出现最多的字符和出现的次数

    逛园子看到一童鞋做的华为上机题目,写来好长的代码,懒得看,感觉不可能这么难,于是动手敲了下. import java.util.Scanner; public class StringTest { / ...

  9. 23.实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty 和Staff。 具体要求如下: (1)Person类中的属性有:姓名name(String类型),地址address(String类型), 电话号码telphone(String类型)和电子邮件地址email(String类型); (2)Employee类中的属性有:办公室office(Stri

    package banking; public class Person { private String name; public String address; public String tel ...

  10. 快速入门系列--WebAPI--04在老版本MVC4下的调整

    WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...