• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 简单解读C++中的虚函数

简单解读C++中的虚函数

作者:NSBeidou 字体:[增加 减小] 来源:互联网 时间:2017-05-28

NSBeidou 通过本文主要向大家介绍了c++析构函数,c++随机数函数,c++函数,c++虚函数,c++构造函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

虚函数

简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码

class A{
  public:
    void print(){ cout<<”This is A”<<endl;}
};

class B:public A{
  public:
    void print(){ cout<<”This is B”<<endl;}
};

int main(){  //为了在以后便于区分,我这段main()代码叫做main1

  A a;
  B b;

  a.print();
  b.print();
}

</div>

通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分别是This is A和This is B。但这是否真正做到了多态性呢?No,多态还有个关键之处就是一切用指向基类的指针或引用来操作对象。那现在就把main()处的代码改一改。

int main()
{  //main2
  A a;
  B b;

  A* p1=&a;
  A* p2=&b; (这里强行用指向基类的指针来操作衍生的对象)

  p1->print();
  p2->print();
}

</div>

运行一下看看结果,哟呵,蓦然回首,结果却是两个This is A。问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数

class A
{
  public:
  virtual void print() { cout<<”This is A”<<endl;} 
};

class B:public A
{
  public:
  void print() { cout<<”This is B”<<endl;}
};

</div>

毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。所以,class B的print()也成了虚函数。那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了。

现在重新运行main2的代码,这样输出的结果就是This is A和This is B了。

现在来消化一下,我作个简单的总结,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。

纯虚函数

虚函数的声明以=0结束,便可将它声明为纯虚函数。包含纯虚函数的类不允许实例化,称为抽象类。 事实上纯虚函数提供了面向对象中接口的功能。当然,这样的接口是以继承的方式实现的。

class CPerson{
public:
  virtual void hello() = 0;
};
CPerson p; // compile error
</div>

注意空方法、纯虚函数、方法声明的区别。类声明中的空方法给出了方法声明+方法定义。 只声明但没有定义的方法将会产生链接错,无论是否被调用过。

class CPerson{
public:
  void empty(){};
  void declare();
};
CPerson::declare(){
  // ...
};
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++构造函数和析构函数的调用顺序
  • C++中构造函数与析构函数的调用顺序详解
  • C++中的friend函数详细解析
  • 简单解读C++中的虚函数
  • 详解C++中如何将构造函数或析构函数的访问权限定为private
  • 浅谈C++基类的析构函数为虚函数
  • 简单介绍C++编程中派生类的析构函数
  • 详解C++编程中的析构函数
  • C++中函数的用法小结
  • C++类成员构造函数和析构函数顺序示例详细讲解

相关文章

  • 2017-05-28一些语言的按行读取文件的代码实现小结
  • 2017-05-28完全掌握C++编程中构造函数使用的超级学习教程
  • 2017-05-28深入解析C++程序中激发事件和COM中的事件处理
  • 2017-05-28C语言 数据结构中栈的实现代码
  • 2017-05-28C语言中使用快速排序算法对元素排序的实例详解
  • 2017-05-28使用C语言实现vector动态数组的实例分享
  • 2017-05-28ipv6实现udp编程示例
  • 2017-05-28C语言中static的作用及C语言中使用静态函数有何好处
  • 2017-05-28C++ 整数拆分方法详解
  • 2017-05-28实例讲解C语言编程中的结构体对齐

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++类中的常数据成员与静态数据成员之间的区别
    • C++循环链表之约瑟夫环的实现方法
    • c/c++实现获取域名的IP地址
    • c++中for双循环的那些事
    • C语言中的正负数及其输出
    • C++编程中指针的声明与基本使用讲解
    • C语言 指针数组详解及示例代码
    • 详解C++编程中对二进制文件的读写操作
    • C++设计模式之解释器模式
    • 二分查找算法在C/C++程序中的应用示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有