c++ virtual总结

匿名 (未验证) 提交于 2019-12-02 22:56:40

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

c++是一门面向对象的语言,但是它和c#,java不同,它没有反射机制。没有反射机制使得c++在语言的一些设计方面与其他语言有点不一样,主要体现在智能化方面,许多东西得程序员明确指定,例如本文要讲的virtual关键字。virtual是在运行时才体现的,而c++在运行时无法使用反射来确定当前类的父类是否有此方法,此方法是否被重载等信息,所以必须在写代码时用virtual来明确指明,然后通过编译器做一些特殊处理(也就是使用虚表)。

我们见到virtual最多的地方是在c++里面的多态实现。

  1. class
  2. public
  3. virtualvoidconst
  4. classpublic
  5. public
  6. virtualvoidconst
  7. classpublic
  8. public
  9. virtualvoidconst

  1. voidconst
  2. int

上面的例子来自于http://www.vckbase.com/document/viewdoc/?id=948,这篇文章里面还提到了多态的一些别的例子。关于多态的文章还有孟岩写的一篇http://blog.csdn.net/wuliming_sc/archive/2009/01/31/3855906.aspx,可以看看。

在很多多态的例子中,我们都可以看到将基类的方法声明为纯虚函数(virtual void run() const = 0;),这样可以要求子类必须实现这个方法,同时可以体现面向接口编程。

对于使用了virtual之后编译器会做些什么,我觉得用代码更容易说明问题。下面的例子来自http://www.cppblog.com/zhangyq/archive/2009/06/13/87597.html







};






















从上面的代码我们可以非常容易的划出class的结构图,当然可以用/d1reportSingleClassLayout来显示class的布局图(http://blog.csdn.net/chief1985/archive/2009/10/23/4720191.aspx)。

使用virtual的地方还有虚拟继承和虚拟析构函数。

虚拟继承的例子如下,来自http://blog.csdn.net/wuliming_sc/archive/2009/01/31/3855607.aspx

  1. class
  2. public
  3. //...
  4. protected
  5. float
  6. float
  7. classpublicvirtual
  8. public
  9. //...
  10. protected
  11. classpublicvirtual
  12. public
  13. //...
  14. protected
  15. float
  16. classpublicpublic
  17. public
  18. //...
  19. protected
  20. float

使用虚拟继承一般都是出现了菱形继承(c++允许多重继承),这种情况下若不使用虚拟继承,便会导致以下情况:

1.公共基类子对象的重复创建问题。

2.成员函数的名字冲突问题

3. 数据成员的名字冲突问题

出现虚拟析构函数的地方也是在多态的时候,如果不使用虚拟析构函数,将会导致子类的析构函数没被调用,例子可以参考http://blog.csdn.net/starlee/archive/2006/03/09/619827.aspx

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

文章来源: c++ virtual总结
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!