虚函数

原创 2018年04月15日 14:05:49

虚函数:

        在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。
     我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。

定义虚函数的限制
(1)非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。
(2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。
(3)当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数(函数名相同、参数列表完全一致、返回值类型相关)自动成为虚函数。
(4)如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。虚函数联系到多态,多态联系到继承。
#include<iostream>
using namespace std;
class A
{
public:
	virtual void fn1(){cout<<"A:fn1"<<endl;}
	virtual void fn2(){cout<<"A:fn2"<<endl;}
	virtual void fn3(){cout<<"A:fn3"<<endl;}
	void fn(){cout<<"fn"<<endl;}
};
class B:public A
{
public:
	virtual void fn1(){cout<<"B:fn1"<<endl;}
	virtual void fn4(){cout<<"B:fn4"<<endl;}
	virtual void fn5(){cout<<"B:fn5"<<endl;}
	void fnn(){cout<<"fnn"<<endl;}
};
class C:public A
{
public:
	virtual void fn1(){cout<<"C:fn1"<<endl;}
	virtual void fn2(){cout<<"C:fn2"<<endl;}
	virtual void fn6(){cout<<"C:fn6"<<endl;}
	virtual void fn7(){cout<<"C:fn7"<<endl;}
	void fnnn(){cout<<"fnnn"<<endl;}
};
void test(A &a)
{
	a.fn1();
	a.fn2();
	a.fn3();
}
void fun(B &b)
{
	b.fn1();
	b.fn4();
	b.fn5();
}
void main()
{
	A a;
	B b;
	C c;
	test(a);
	test(b);
	test(c);
	fun(b);
	cout<<(int*)&a<<endl;
	cout<<(int*)*((int*)&a)<<endl;
	cout<<(int*)&b<<endl;
	cout<<sizeof(A)<<endl;
	cout<<sizeof(B)<<endl;
	cout<<sizeof(C)<<endl;
}


C++中虚函数的用法详细讲解

我们知道,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。例如在例...
  • zhuaimiao1
  • zhuaimiao1
  • 2015-10-15 22:43:51
  • 1902

C++学习笔记(14)——虚函数与重载函数的区别

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!                      ...
  • livelylittlefish
  • livelylittlefish
  • 2008-03-12 00:14:00
  • 7029

C++中虚函数与纯虚函数以及虚继承的相关知识

这篇文章主要利用网上的博客,经过自己的总结写成,不免出现错误情况,如有错误,请指正。 虚函数 首先是虚函数的意义。在面向对象的设计思想中,虚函数的作用是实现多态性。如何实现多态呢?下面看C++虚函数表...
  • chy19911123
  • chy19911123
  • 2015-09-08 20:42:53
  • 1199

C++常见面试题:虚函数实现原理

转载地址:http://blog.csdn.net/wanghaobo920/article/details/7674631 前言 C++中的虚函数的作用主要是实现了多态的...
  • zjuxsl
  • zjuxsl
  • 2015-03-30 21:08:46
  • 1087

虚函数和抽象函数的区别

虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写   抽象函数是没有代码,子类继承后一定要重写 在一个类中用虚函数:   是因为在超类中的有实际代码的方法,但明确允许...
  • rfb0204421
  • rfb0204421
  • 2008-12-18 13:20:00
  • 9207

继承多态与虚函数及对类的理解

B是A的子类,子类会继承父类的public方法,子类对象可以调用父类的public接口,但是子类和父类函数重名时,父类的方法会被子类覆盖(隐藏),子类调用和父类同名同参函数或者重载父类的函数后不可以直...
  • qq_35956442
  • qq_35956442
  • 2016-11-17 13:41:30
  • 508

C++中析构函数为虚函数时调用发生了什么变化

昨天去XX公司面试,面试官问了一个关于C++类析构函数为虚函数时,如果是父类的指针用子类来new,如果发生析构时,析构函数是virtual与不是virtual有什么区别。当时答的不好,回来总结了一下,...
  • fenghaibo00
  • fenghaibo00
  • 2011-08-16 18:20:04
  • 2773

C++学习笔记之多态(虚函数)

多态可以分为静态的多态和动态多态,静态多态即所谓的函数重载,在编译阶段即可确定是使用哪个函数。动态多态是通过虚函数来实现的,并基于类的继承来表现。 在使用过程中应注意以下几点: 1、虚函数使用过程中,...
  • ljp1919
  • ljp1919
  • 2015-10-03 15:16:16
  • 1131

函数重载与虚函数的区别

函数重载和虚函数在概念和使用方式方面的区别1.函数重载可以用于非成员函数和类的成员函数,而虚函数只能用于类的成员函数2.函数重载可用于构造函数,而虚函数不能用于构造函数3.如果对成员函数进行重载,重载...
  • Sunshine_in_Moon
  • Sunshine_in_Moon
  • 2015-05-13 19:13:22
  • 2184

C++虚函数的概念

虚函数: l  虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。虚函数的特点是,只要定义一个基类的指针,就可以指向派生类的对象。 注:无虚函数时,遵循以下规则:C++...
  • u011702002
  • u011702002
  • 2017-08-20 20:58:26
  • 319
收藏助手
不良信息举报
您举报文章:虚函数
举报原因:
原因补充:

(最多只允许输入30个字)