纯虚函数和抽象类

-------------------siwuxie095

纯虚函数


C++ 中,用 纯 字来修饰虚函数,即 纯虚函数

纯虚函数没有函数体,同时在定义时,函数名的后边要加
=0

看如下实例:

纯虚函数在虚函数表中的实现:

如果定义了一个 Shape 类,因为其中有虚函数和纯虚函数,

所以
Shape 类一定有一个虚函数表,当然,也就会有一个

虚函数表指针

在虚函数表中,如果是一个普通虚函数,则对应的函数指针

就是一个有意义的值,如果是一个纯虚函数,则对应的函数

指针的值就是
0

抽象类

纯虚函数一定是某个类的成员函数,包含纯虚函数的类叫 抽象类,

即便只含有一个纯虚函数

显然,上面的 Shape 类就是一个抽象类,如果使用 Shape 类

实例化一个对象,当该对象想去调用纯虚函数
calcPerimeter(),

该怎么调用呢?显然是没法调用的

所以,对于抽象类来说,C++ 不允许它实例化对象

如果强行从栈中 或 堆中实例化一个对象,就会报错

不仅如此,抽象类的子类也有可能是抽象类

如下:

定义一个人类:Person,它是一个抽象类,因为人的概念太抽象了,

所以工作不知道要做什么,就直接写成纯虚函数,打印信息也不知道

要打印什么,就也写成纯虚函数

当使用工人类
Worker 去继承人类 Person 时,可以想象,对于工人

来说,工种也是非常多的,单凭一个工人,可以打印一些他的信息,

如:名字、工号等,但他的工作也没有办法清晰具体的描述出来,于

是将
work() 也定义成纯虚函数

此时,Worker 作为 Person 的子类,它也是一个抽象类

当明确了是什么工种,如:清洁工
Dustman,它继承了 Worker,

也是工人的一种

对于抽象类来说,它无法去实例化对象,抽象类的子类只有把抽象类中

的所有纯虚函数都做了实现,这个子类才可以实例化对象

程序:

Person.h:


#ifndef PERSON_H

#define PERSON_H

//注意:对于每一个 .h 文件,都加了宏定义

//这是为了 .h 文件的重复包含

#include <string>

using namespace std;

class Person

{

public:

Person(string name);

virtual ~Person();//虚析构函数

//Person类太过抽象
所以work()不知道该干些什么所以定义成纯虚函数

//假如在子类中同名函数work()没有被实现的话
同样无法实例化对象

virtual
void work() = 0;

private:

string m_strName;

};

//纯虚函数
没有函数体(即大括号以及函数的实现)
括号后加 =0

//有纯虚函数的类是抽象类
抽象类无法实例化对象

//无论是从堆中还是栈中都无法实例化对象,抽象类的子类也有可能是抽象类(即继承)

#endif

Person.cpp:


#include
"Person.h"

Person::Person(string name)

{

m_strName = name;

}

Person::~Person()

{

}

Worker.h:


#ifndef WORKER_H

#define WORKER_H

#include
"Person.h"

class Worker :public Person

{

public:

Worker(string name,int age);

virtual ~Worker();

//假如此时work()依然没有被实现
那么Worker类也是抽象类

//virtual void work();

//

//Worker类中work()工种太多
也不知道该干些什么

//所以依然定义为纯虚函数
或者直接继承父类的纯虚函数

//virtual void work()=0;

private:

int m_iAge;

};

#endif

Worker.cpp:


#include
"Worker.h"

#include <iostream>

using namespace std;

Worker::Worker(string name, int age) :Person(name)

{

m_iAge = age;

}

Worker::~Worker()

{

}

//void Worker::work()

//{

// cout << "Worker::work()" << endl;

//}

Dustman.h:


#ifndef DUSTMAN_H

#define DUSTMAN_H

#include
"Worker.h"

class Dustman :public Worker

{

public:

Dustman(string name, int age);

virtual ~Dustman();

//这里work()的事情则比较明确 "扫地"
所以在这里将之实现

virtual
void work();

};

#endif

Dustman.cpp:


#include
"Dustman.h"

#include <iostream>

using namespace std;

Dustman::Dustman(string name, int age) :Worker(name, age)

{

}

Dustman::~Dustman()

{

}

void Dustman::work()

{

cout << "扫地" << endl;

}

main.cpp:


#include <stdlib.h>

#include
"Dustman.h"

#include <iostream>

using namespace std;

//对于一个类来说,它如果含有纯虚函数,那么它就无法进行实例化

//

//无法进行实例化这件事,本身是个双刃剑:

//(1)对于一些抽象的类来说,往往不希望它能实例化,

//因为它实例化之后也没什么用

//(2)对于一些具体的类来说,要求必须实现那些纯虚函数,

//使它变成一个具有具体动作的函数,这样的类往往也比较具体

//

//在实际编码中,要具体情况具体分析

int main(void)

{

//Worker worker("zhangsan", 20);

Dustman dustman("lisi", 15);

system("pause");

return
0;

}

//纯虚函数:在虚函数表中其函数指针指向0 是一个无意义的值

//即不需要实现
也没有函数入口地址

//

//子类如果想要实例化
则必须实现在父类中被定义为纯虚函数的函数

【made by siwuxie095】

时间: 2024-12-07 13:13:59

纯虚函数和抽象类的相关文章

C++:纯虚函数与抽象类

5.4.3 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数. 声明纯虚函数的一般格式是: virtual 函数类型 函数名(参数表)=0: 纯虚函数的作用是:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义.纯虚函数没有函数体,它最后面“=0 ”并不表示函数的返回值是0,它只是形式上的作用,告诉编译系统这是纯虚函数.纯虚函数不具有函数的功能,不能被调用. //应用举例 #includ

C++学习基础十二——纯虚函数与抽象类

一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个类中含有虚函数,则必须将该类的析构函数声明为虚函数. 4.虚函数与纯虚函数的声明: virtual void draw();//虚函数 virtual void draw() = 0;//纯虚函数 5.C++中支持两种多态性: 编译时多态:通过重载函数实现. 运行时多态:通过虚函数实现. 二.Jav

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

纯虚函数_抽象类

解耦合 和 模块的划分 c++没有接口的概念  但可以使用纯虚函数(抽象类)实现接口的功能 纯虚函数和抽象类纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本纯虚函数为各派生类提供一个公共界面(接口的封装和设计,软件的模块功能更划分) 纯虚函数说明形式: virtual 类型 函数名(参数表)= 0: 含有纯虚函数的基类 称为抽象类. class shape { point center; public: virtual void rotate(int)=0;

C++基础(纯虚函数与抽象类)

C++基础之纯虚函数与抽象类 引言 纯虚函数在C++编程中的地位很重要,其关联到了设计模式中"接口"的概念. 语法 纯虚函数的语法: 1.  将成员函数声明为virtual 2.  后面加上 = 0 3.  该函数没有函数体 1 class <类名> 2 { 3 virtual <类型><函数名>(<参数表>) = 0; 4 - 5 }; 例如: 1 class CmdHandler 2 { 3 virtual void OnComman

c++,纯虚函数与抽象类

1.纯虚函数的定义: (1)虚函数被“初始化”为0的函数.声明纯虚函数的一般形式是virtual 函数类型 函数名(参数表列) =0;(2)纯虚函数没有函数体:(3)最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”; (4)这是一个声明语句,最后必须加分号.(5)不能在当前类中定义 普通的虚函数 class Base { public: int i; void show1(); virtual void show2() ;//普通的虚函数 } 纯虚函数:

Hello,C++(5)纯虚函数和抽象类

纯虚函数和抽象类 下面通过一个例子来说明纯虚函数的定义方法 在这个类当中,我们定义了一个普通的虚函数,并且也定义了一个纯虚函数.那么,纯虚函数是什么呢??从上面的定义可以看到,纯虚函数就是没有函数体,同时在定义的时候,其函数名后面要加上“= 0”. 纯虚函数的实现原理 本节从虚函数表的角度来说明纯虚函数的实现原理. 上面就是我们在前面课程讲到的多态的实现原理,在讲这一部分的时候,讲到了虚函数表以及虚函数表指针.如果我们定义了Shape这样的类,那么,Shape类当中,因为有虚函数和纯虚函数,所以

c++-纯虚函数和抽象类

纯虚函数和抽象类 C面向接口编程和C多态 函数类型语法基础 函数指针做函数参数(回调函数)思想剖析 函数指针做函数参数两种用法(正向调用.反向调用) 纯虚函数 抽象类 抽象类基本概念 抽象类在多继承中的应用 面向抽象类编程案例强化 C面向接口编程和C多态 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //图形类 //如果说一个类 拥有一个纯虚函数 //就称这个类是一个抽象类. //不管这个类中有

c++虚函数,纯虚函数,抽象类,覆盖,重载,隐藏

C++虚函数表解析(转) ——写的真不错,忍不住转了  http://blog.csdn.net/hairetz/article/details/4137000 浅谈C++多态性  http://blog.csdn.net/hackbuteer1/article/details/7475622 C++抽象类  http://www.cnblogs.com/dongsheng/p/3343939.html C++的精髓——虚函数  http://blog.chinaunix.net/uid-268