1.在声明函数时,在最前加上virtual,则该函数就是函虚数,基类的虚函数被派生类继承后仍是虚函数。
2.派生类中可以重写基类的虚函数。
3.用指针访问重写的虚函数时,被访问的虚函数是指针指向的对象所属类的函数(只看指向的对象所属的类)。

而用指针访问重写的普通函数时,被访问的函数是指针类型所属类的函数(只看指针是什么类)

4.(引用和指针相同)

5. 虚函数的使用:静态关联和动态关联。

  有的虚函数在编译时能确定它属于哪个类,这属于静态关联。如:通过对象名调用的虚函数。

  有的时候虚函数的应用则可以实现动态关联,如:下面的代码中实现的多态功能,传入不同类的指针,执行不同类中的函数。


#include <iostream>
using namespace std; //////////////////////////// class Base {
public:
void show1();
virtual void show2();
};
void Base::show1() {
cout << "Base::show1()...." << endl;
}
void Base::show2() {
cout << "Base::show2()...." << endl;
}
//////////////////////////// class Child: public Base {
public:
void show1();
virtual void show2(); //感觉如果show2在其父类已经声明为virtual,这里virtual可以不要。即便接着向下派生,这个virtual写不写都能正确调用下级派生类。
}; //基类的虚函数被派生类继承后仍是虚函数。
void Child::show1() {
cout<<"Child::show1()\n";
}
void Child::show2() {
cout<<"Child::show2()...\n";
} class Child2: public Child {
public:
void show1();
void show2();
};
void Child2::show1() {
cout<<"Child2::show1()\n";
}
void Child2::show2() {
cout<<"Child2::show2()...\n";
} //////////////////////////// class Test :public Base{
public:
virtual void show2(); // 感觉这个virtual可以不要。
};
void Test::show2() {
cout<<"Test::show2().."<<endl;
} ////////////////////////////
void f1(Base *p)
{
p->show1(); //指针的指向就是Base::show1()
//用指针访问重写的普通函数时,被访问的函数是参数列表所声明的类的函数。
}
void f2(Base *p)
{
//用指针访问重写的虚函数时,被访问的虚函数是指针指向的对象所属类的函数。
p->show2();
}
void f3(Child *p)
{
p->show2();
}
//////////////////////////////
int main() {
Child child;
Base base;
Test test;
Child2 child2 ; //再下级的派生类 f1(&base); //Base::show1()....对于普通函数:被访问的函数是参数列表所声明的类的函数
f1(&child); //Base::show1()....
f1(&test); //Base::show1()...
f1(&child2); //Base::show1()... f2(&child); //Child::show2()...//用指针访问重写的虚函数时,被访问的虚函数是指针指向的对象所属类的函数
f2(&base); //Base::show2()....//这就是虚函数的意义:函数体一样,却能传入不同的函数指针执行各自的功能
f2(&test); //Test::show2()..
f2(&child2); //Child2::show2().. //Child { void show2() ;} 要不要virtual效果一样 f3(&child2);
while();
return ;
}

c++,虚函数的更多相关文章

  1. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  2. 匹夫细说C#:从园友留言到动手实现C#虚函数机制

    前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编 ...

  3. 【C++】多态性(函数重载与虚函数)

    多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. ...

  4. 虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数->抽象类,基类虚析构函数使释放对象更彻底

    为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) #include<iostream> usi ...

  5. C++ 系列:虚函数

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  6. EC笔记,第二部分:9.不在构造、析构函数中调用虚函数

    9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete ...

  7. C++构造函数中不能调用虚函数

    在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造 ...

  8. C#虚函数和接口的区别

    接口只能声明不能实现,虚函数可以. 接口:对外提供可以访问的函数叫接口.虚函数不需要被强制重写,其本身含有实现部分. 抽象类:指派了派生类必须实现的函数(纯虚函数),不然编译不通过. 虚函数的限制:  ...

  9. c++ 虚函数

    class A { public: virtual void f();//希望派生类重写 void fun();//绝大多数情况下不要重新定义基类的非虚函数,那样会打破公有继承Is-A的关系,而且行为 ...

  10. 为何JAVA虚函数(虚方法)会造成父类可以"访问"子类的假象?

      首先,来看一个简单的JAVA类,Base. 1 public class Base { 2 String str = "Base string"; 3 protected vo ...

随机推荐

  1. javamail发送二进制流附件的问题

    最近做个邮件发送功能,要内嵌图片并有附件. 需求很奇怪,图片和附件文件是放在ftp服务器上的,查了下javamail的文档. 添加附件方法如下 MimeBodyPart messageBodyPart ...

  2. OSG项目经验2<在场景中添加文字面版>

    添加文字版需要用到osg的三个名字空间:                         osgText::Text,这个类用来添加文字和设置文字的一些属性:                     ...

  3. Access2007中如何运行SQL执行SQl语句

    1. 在“创建”选项卡中,单击“其他”组中的“查询设计”. 2. 单击“显示表”对话框中的“关闭”,而不添加任何表或查询. 3. 在“设计”选项卡中,单击“查询类型”工作组中的“联合”. 4. 单击“ ...

  4. HeapAnalyzer

    https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=4544baf ...

  5. RFID介绍及电子标签成本预估

    What is RFID • RadioFrequencyIdentification, (無線射頻識別系統)• 通常是由感測器(Reader)和RFID標籤(Tag)所組成的系統 RFID分類 • ...

  6. MSSQL SERVER 2008 R2 无法连接到数据库,用户sa登录失败,错误:18456

    原因:勾选了强制实施密码策略,但是设置的密码很简单依然可以,比如:123456 这是为什么?原来,这个功能要用到NetValidatePasswordPolicy() API这个函数. (该功能只有在 ...

  7. Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)

    我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...

  8. Swift与Objective-C API的交互

    互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定 ...

  9. Html.raw(转帖)

    Razor 在JS中嵌入后台变量 HTML 中定义全局变量 @{int CurrentUserId =ViewBag.CurrentUserId;} JS中取值方式var CurrentUserId ...

  10. 使用VS创建WebPart部件,并部署到SP(待修改)

    http://www.cnblogs.com/mingmingruyuedlut/archive/2012/12/02/2789488.html