[C++基础] 纯虚函数

时间:2021-11-04 20:14:53

整理摘自https://blog.csdn.net/ithomer/article/details/6031329

1. 申明格式

class CShape
{
public:
virtual void Show()=;
};

在普通的虚函数后面加上"=0"这样就声明了一个pure virtual function.

2. 何时使用纯虚函数?

(1)当想在基类中抽象出一个方法,且该基类只做能被继承,而不能被实例化;
(2)这个方法必须在派生类(derived class)中被实现;
  如果满足以上两点,可以考虑将该方法申明为pure virtual function.

3. 举例说明

(1)不可实例化含有虚函数的基类

我们来举个例子,我们先定义一个形状的类(Cshape),但凡是形状我们都要求其能显示自己。所以我们定义了一个类如下:

class CShape
{
virtual void Show(){};
};

但没有CShape这种形状,因此我们不想让CShape这个类被实例化,我们首先想到的是将Show函数的定义(实现)部分删除如下:

class CShape
{
virtual void Show();
};
当我们使用下面的语句实例化一个CShape时:
CShape cs;  //这是我们不允许的,但仅用上面的代码是可以通过编译(但link时失败)。
 
怎样避免一个CShape被实例化,且在编译时就被发现?
答案: 使用pure virtual function.
class CShape
{
public:
virtual void Show()=;
};

当实例化CShape cs 后,会报错:

error: cannot declare variable ‘cs’ to be of abstract type ‘CShape’
CShape cs;
              ^
note: because the following virtual functions are pure within ‘CShape’:
class CShape
          ^
note: virtual void CShape::Show()
virtual void Show()= 0;

^

(2)派生类中堆基类中虚函数的实现

        我们再来看看被继承的情况,我们需要一个CPoint2D的类,它继承自CShape.它必须实现基类(CShape)中的Show()方法。
        其实使用最初的本意是让每一个派生自CShape的类,都要实现Show()方法,但时常我们可能在一个派生类中忘记了实现Show(),为了避免这种情况,pure virtual funcion发挥作用了。
class CShape
{
public:
virtual void Show()= ;
}; class CPoint2D: public CShape
{
public: void Msg()
{
printf("CPoint2D.Msg() is invoked.\n");
}
/*
void Show()
{
printf("Show() from CPoint2D.\n");
}
*/
};

当实例化 CPoint2D p2d时,报错

error: cannot declare variable ‘p2d’ to be of abstract type ‘CPoint2D’
CPoint2D p2d;
                ^
note: because the following virtual functions are pure within ‘CPoint2D’:
class CPoint2D: public CShape
         ^
note: virtual void CShape::Show()
virtual void Show()= 0;
                  ^

我们预防了在派生类中忘记实现基类方法。如果不在派生类的中实现在Show方法,编译都不会通过。[C++基础] 纯虚函数

以下为完整代码:

#include <iostream>
#include <cstdio>
using namespace std; class CShape
{
public:
virtual void Show()= ;
}; class CPoint2D: public CShape
{
public: void Msg()
{
printf("CPoint2D.Msg() is invoked.\n");
} void Show()
{
printf("Show() from CPoint2D.\n");
}
}; int main()
{
CPoint2D p2d;
p2d.Msg();
CPoint2D *pShape = &p2d;
pShape -> Show();
return ;
} /* Output:
CPoint2D.Msg() is invoked.
Show() from CPoint2D.
*/

[C++基础] 纯虚函数的更多相关文章

  1. C&plus;&plus;基础(纯虚函数与抽象类)

    C++基础之纯虚函数与抽象类 引言 纯虚函数在C++编程中的地位很重要,其关联到了设计模式中"接口"的概念. 语法 纯虚函数的语法: 1.  将成员函数声明为virtual 2.  ...

  2. C&plus;&plus;学习基础十二——纯虚函数与抽象类

    一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个 ...

  3. C&plus;&plus;基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构

    一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型 ...

  4. C&plus;&plus;语言基础&lpar;13&rpar;-抽象类和纯虚函数

    一.基本语法 在C++中,可以将虚函数声明为纯虚函数,语法格式为: ; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数. 最后的=0并不表示函数返回值为0,它只起形 ...

  5. C&plus;&plus;基础 &lpar;7&rpar; 第七天 多态的原理 纯虚函数和抽象类 依赖倒置原则

    1 昨日回顾 2 多态的原理 1 要有继承 2 要有子类重写父类的虚函数 3 父类指针(或者引用)指向子类对象 (动态联编 虚函数表 3 证明vptr指针的存在 4 vptr指针在构造父类的时候是分步 ...

  6. C&plus;&plus;基础--虚函数和纯虚函数

    虚函数的一种重要的应用是在子类重写父类方法上,一般都是在父类中声明的时候用关键字virtual修饰. 在C++中,一个父类的对象指针是可以指向子类的实例化对象,这个时候可以用该对象指针来访问父类的成员 ...

  7. C&plus;&plus;复习:纯虚函数和抽象类

    纯虚函数和抽象类 1基本概念 2抽象类案例   3抽象类在多继承中的应用 C++中没有Java中的接口概念,抽象类可以模拟Java中的接口类.(接口和协议) 3.1有关多继承的说明 工程上的多继承 被 ...

  8. 谈谈c&plus;&plus;纯虚函数的意义!

    纯虚函数的存在有什么意义呢?相信大学假设有c++这么课程.在讲到纯虚函数时,必然会讲到纯虚函数是面向接口编程的基础. 如今和大家分享下纯虚函数设计的原由.目的.产生的效果. 现代软件project很庞 ...

  9. c&plus;&plus;-纯虚函数和抽象类

    纯虚函数和抽象类 C面向接口编程和C多态 函数类型语法基础 函数指针做函数参数(回调函数)思想剖析 函数指针做函数参数两种用法(正向调用.反向调用) 纯虚函数 抽象类 抽象类基本概念 抽象类在多继承中 ...

随机推荐

  1. Jsp&comma;EL表达式的入门

    Jsp,EL表达式的入门 *Servlet/JSP 是两种动态的WEB资源的两种技术 使用Servlet生成HTML的页面是可以的 response.getWriter("<form ...

  2. TortoiseHg简单的入门使用说明

    参考资料: 互普的 TortoiseHg使用说明_百度文库 Mercurial(Hg)基本操作 - Tim Gong - 博客园 Mercurial与TortoiseHg使用入门教程(转) - mee ...

  3. java&lowbar;集合框架

    一.集合框架图 二.Collection接口     Collection中可以存储的元素间无序,可以重复的元素.     Collection接口的子接口List和Set,Map不是Collecti ...

  4. Reverse Integer 2015年6月23日

    题目: Reverse digits of an integer. Example1: x = , return Example2: x = -, return - 思路:递归 解答: / test ...

  5. ExtJs的expand和collapse

    最近在研究ExtJs的窗口组件(Ext.window),关于扩展显示expand和折叠显示collapse的一点心得记录一下,以便后查. var win2 = new Ext.window({ id ...

  6. 久未更 ~ 五之 —— 引入外部CSS样式表 小节

    > > > > > 久未更 系列一:在html中引入外部css样式表 //引入外部css样式表 //<lilnk>要放在<head>标签的第一行, ...

  7. 从零基础到拿到网易Java实习offer,谈谈我的学习经验

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  8. (python)数据结构---字典

    一.描述 由键值key-value组成的数据的集合 可变.无序的,key不可以重复 字典的键key要可hash(列表.字典.集合不可哈希),不可变的数据结构是可哈希的(字符串.元组.对象.bytes) ...

  9. win10 安装多个版本的jdk,如何切换

    JAVA_HOME C:\software\jdk1.7.0_79 CLASSPATH  .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\dt.jar ...

  10. 【LeetCode】199&period; Binary Tree Right Side View

    Binary Tree Right Side View Given a binary tree, imagine yourself standing on the right side of it, ...