浅析c++中virtual关键字
http://blog.csdn.net/djh512/article/details/8973606
1.virtual关键字主要是什么作用?
2.那些情况下可以使用virtual关键字?
- class GrandFather
- {
- public:
- GrandFather() {}
- virtual void fun()
- {
- cout << "GrandFather call function!" << endl;
- }
- };
- class Father : public GrandFather
- {
- public:
- Father() {}
- void fun()
- {
- cout << "Father call function!" << endl;
- }
- };
- class Son : public Father
- {
- public:
- Son() {}
- void fun()
- {
- cout << "Son call function!" << endl;
- }
- };
- void print(GrandFather* father)
- {
- father->fun();
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Father * pfather = new Son;
- pfather->fun();
- GrandFather * pgfather = new Father;
- print(pgfather);
- return 0;
- }
输出为 Son call function
4.virtual的继承性
5.虚析构函数
- class GrandFather
- {
- public:
- GrandFather() {}
- virtual void fun()
- {
- cout << "GrandFather call function!" << endl;
- }
- ~GrandFather()
- {
- cout << "GrandFather destruction!" << endl;
- }
- };
- class Father : public GrandFather
- {
- public:
- Father() {}
- void fun()
- {
- cout << "Father call function!" << endl;
- }
- ~Father()
- {
- cout << "Father destruction!" << endl;
- }
- };
- class Son : public Father
- {
- public:
- Son() {}
- void fun()
- {
- cout << "Son call function!" << endl;
- }
- ~Son()
- {
- cout << "Son destruction!" << endl;
- }
- };
- void print(GrandFather* p)
- {
- p->fun();
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Father * pfather = new Son;
- delete pfather;
- return 0;
- }
以上代码输出:Father destruction!
6. 纯虚函数
- class GrandFather
- {
- public:
- GrandFather() {}
- virtual void fun() = 0
- {
- cout << "GrandFather call function!" << endl;
- }
- virtual ~GrandFather()
- {
- cout << "GrandFather destruction!" << endl;
- }
- };
纯虚函数为后代类提供可覆盖的接口,但这个类中的版本决不会调用。
7.虚继承
- class GrandFather
- {
- public:
- GrandFather() {}
- void fun()
- {
- cout << "GrandFather call function!" << endl;
- }
- virtual ~GrandFather()
- {
- cout << "GrandFather destruction!" << endl;
- }
- };
- class Father1 : public GrandFather
- {
- public:
- Father1() {}
- void fun()
- {
- cout << "Father call function!" << endl;
- }
- };
- class Father2 : public GrandFather
- {
- public:
- Father2() {}
- void fun()
- {
- cout << "Father call function!" << endl;
- }
- };
- class Son : public Father1, public Father2
- {
- public:
- Son() {}
- //void fun()
- //{
- // cout << "Son call function!" << endl;
- //}
- };
- void print(GrandFather* p)
- {
- p->fun();
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Son* son = new Son;
- son->fun();
- return 0;
- }
编译时会提示报错对fun的访问不明确
8. 构造函数和析构函数中的虚函数
10.小结
- class classA
- {
- public:
- classA()
- {
- clear();
- }
- virtual ~classA()
- {
- }
- void clear()
- {
- memset(this , 0 , sizeof(*this));
- }
- virtual void func()
- {
- printf("func\n");
- }
- };
- class classB : public classA
- {
- };
- int main(void)
- {
- classA oa;
- classB ob;
- classA * pa0 = &oa;
- classA * pa1 = &ob;
- classB * pb = &ob;
- oa.func(); // 1
- ob.func(); // 2
- pa0->func(); // 3
- pa1->func(); // 4
- pb->func(); // 5
- return 0;
- }
补充一个例子,这个程序输出依次是
- memset(this , 0 , sizeof(*this));
找不到虚表地址也没有关系
- class classB : public classA
- <pre name="code" class="cpp" style="font-weight: bold;">{</pre><pre name="code" class="cpp" style="font-weight: bold;"> classB()
- {
- clear();
- }
- virtual ~classB()
- {
- }
- void clear()
- {
- memset(this , 0 , sizeof(*this));
- }</pre><br>
- <pre></pre>
- <pre name="code" class="cpp" style="font-weight: bold;">};</pre>输出为
浅析c++中virtual关键字的更多相关文章
- 浅析C#中new、override、virtual关键字的区别
Virtual : virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 默认情况下,方法是非虚拟的.不能重写非虚方法. virtual 修饰符不能与 stati ...
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 【转】浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
- 浅析Java中的native关键字
浅析Java中的native关键字 native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中.Java语言本身不能对操作系统底层进 ...
- C#基础知识五之abstract virtual关键字
abstract 用关键字abstract修饰的类叫做抽象类,且只能作为基类,也不能实例化. 用abstract定义的抽象类中不一定只包含抽象方法 ,可以包含非抽象方法. abstract定义的方法一 ...
- 浅析JS中的模块规范(CommonJS,AMD,CMD)////////////////////////zzzzzz
浅析JS中的模块规范(CommonJS,AMD,CMD) 如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. ...
- asp.net中virtual和abstract的区别
这篇文章主要介绍了asp.net中virtual和abstract的区别,较为详细的分析了virtual与abstract的概念与具体用法,并以实例的形式予以总结归纳,需要的朋友可以参考下 本文实例分 ...
- asp.net中virtual和abstract的区别分析
这篇文章主要介绍了asp.net中virtual和abstract的区别,较为详细的分析了virtual与abstract的概念与具体用法,并以实例的形式予以总结归纳,需要的朋友可以参考下 本文实例分 ...
随机推荐
- 报错stale element reference: element is not attached to the page document结局方案
今天在调试脚本时,遇到如下报错: org.openqa.selenium.StaleElementReferenceException: stale element reference: elemen ...
- js各种小知识
1.获取函数里面的参数个数 function test(x,y,z){} // 获取test参数的个数 console.log(test.length)
- Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果
前言 接着上一期Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件 的博客开始,同样,在开始前我们先来看一下目标效果: 下面上一下本章需要实现的效果图: 大家看到这个效果 ...
- 原生js返回顶部
let backToTop = function() { let scrollToptimer = setInterval(function() { let top = document.body.s ...
- Java动态性之--反射机制
1. 动态语言 程序运行时,可以改变结构或变量类型.典型的语言: Python.ruby.javascript等 如下javascript代码 function test(){ var s = &qu ...
- gym 101986
A - Secret of Chocolate Poles 队友写的. 好像水水的. //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pr ...
- java 常用面试题
基础问题和思想:1.抽象类和接口的区别(单纯的语法区别只能给一半分,要说出来适用场景):2.hashcode()和equals()的关系:3.HashMap(Set)底层机制(用到的数据结构以及代码原 ...
- js导出带格式的表格(包括单元格合并,字体样式等)
function HtmlExportToExcelForEntire() { var uri = 'data:application/vnd.ms-excel;base64,', template ...
- JAVA-Exception&Error
JAVA--Exception&Error 在万物皆对象的JAVA中,先让我们看看Exception和Error的地位吧:
- 【翻译】What is State Machine Diagram(什么是状态机图)?
[翻译]What is State Machine Diagram(什么是状态机图)? 写在前面 在上一篇学习类图的时候将这个网站上的类图的一篇文章翻译了出来,感觉受益良多,今天来学习UML状态机图, ...