c++,虚函数
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++,虚函数的更多相关文章
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- 匹夫细说C#:从园友留言到动手实现C#虚函数机制
前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编 ...
- 【C++】多态性(函数重载与虚函数)
多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. ...
- 虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数->抽象类,基类虚析构函数使释放对象更彻底
为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) #include<iostream> usi ...
- C++ 系列:虚函数
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- EC笔记,第二部分:9.不在构造、析构函数中调用虚函数
9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete ...
- C++构造函数中不能调用虚函数
在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造 ...
- C#虚函数和接口的区别
接口只能声明不能实现,虚函数可以. 接口:对外提供可以访问的函数叫接口.虚函数不需要被强制重写,其本身含有实现部分. 抽象类:指派了派生类必须实现的函数(纯虚函数),不然编译不通过. 虚函数的限制: ...
- c++ 虚函数
class A { public: virtual void f();//希望派生类重写 void fun();//绝大多数情况下不要重新定义基类的非虚函数,那样会打破公有继承Is-A的关系,而且行为 ...
- 为何JAVA虚函数(虚方法)会造成父类可以"访问"子类的假象?
首先,来看一个简单的JAVA类,Base. 1 public class Base { 2 String str = "Base string"; 3 protected vo ...
随机推荐
- HDU 5226 Tom and matrix(组合数学+Lucas定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5226 题意:给一个矩阵a,a[i][j] = C(i,j)(i>=j) or 0(i < ...
- OA项目总结
一.自定义拦截器: 继承AbstractInterceptor,覆写intercept方法,实现功能逻辑,最后在Struts.xml文件中配置了自定义拦截器,首先自定义拦截器栈, <!- ...
- C——货物管理系统
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- 有意思的C宏
在Linux内核.嵌入式代码等传统的C代码里,会有一些难以识别的宏定义.我记得在eCos, UBoot, FFmpeg有一些比较BT的宏定义,很难读懂.对于C++程序员来说,最好将这种难读的宏定义转成 ...
- Lotus Sametime 服务器的安装和配置
IBM Lotus Sametime 是一款强大的实时协作软件,目前最新版本是 7.5.1.通过它,您不仅能够进行网络聊天,而且可以方便地召开网络会议.在网络社区中与其他人进行沟通.了解更多关于 Lo ...
- ALV列、行、单元格颜色设置
)颜色含义 :海蓝:2:浅清:3:黄色:4:浅蓝:5:青色:6:红色:7:橙色. (1)首位为主颜色: (2)次位为辅助颜色: (3)末位为0时,表示首位数字表为表格的底色: 末位为1时,则表示以1为 ...
- js动画学习(四)
七.多属性封装函数 前面分别介绍了单独改变单一属性值得动画,从本节起开始介绍多属性封装函数,一个函数搞定多种属性值的改变. 首先介绍一个很重要的函数getStyle(),这个函数返回一个元素的当前属性 ...
- BZOJ 2748 音量调节
这道题我开始做时想用搜索来做,但是失败了,后来仔细一想发现这就是一个背包问题,之后一切就简单多了. 代码如下: #include<cstdio> #includ ...
- Setting property 'source' to 'org.eclipse.jst.jee.server [问题点数:40分]
链接地址:http://bbs.csdn.net/topics/390131469 警告: [SetContextPropertiesRule]{Context} Setting property ' ...