`

C++][基础知识 5] 虚函数

    博客分类:
  • C++
 
阅读更多
五 虚函数
    VC++中的虚函数主要用来实现程序运行的多态性。所谓多态性是指发出同样的消息(如函数的调用)被不同类型的对象接受时导致不同的行为。利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接受消息的对象。对象根据所接受到的消息而做出相应的操作。
多态性是面向对象程序设计的重要特征之一。它与前面讲过的封装性和继承性构成了面向对象程序设计的三大特征。这三大特性是相互关联的。封装性是基础,继承性是关键,多态性是补充。
    VC++中的多态可以分为两种,一种是编译时的多态性,一种是运行时的多态性。编译时的多态性主要是通过函数的重载和运算符的重载来实现,它在程序运行之前(编译时)就能够确定其实现的方法。运行时的多态性则要等到程序运行时才能确定程序的具体执行情况,它主要通过虚函数来实现。
 虚函数的定义及使用
如果将函数定义为虚函数,则表示函数的具体实现是不确定的,相同的调用形式要根据运行时不同的对象来确定其实现方式。它与函数的重载不同,函数的重载根据其调用形式(函数的参数)就能够确定其实现方式。
    在类中,如果在某一函数的前面加上关键字”virtual”,则表示将该函数说明为虚函数。虚函数一定是类的成员函数,其多态性要通过类的继承关系来实现。如果将类中的函数说明为虚函数,则该类的派生类中相同原型的函数(同名,且参数类型,顺序以及个数都相同)均具有虚特性而不管是否有关键子”virtual”修饰。例如:
#include<iostream.h>
class A{
public:
	virtual void fun()        //A行
	{cout<<"类A中的函数\n";}
};
class B:public A{
public:
	void fun()
	{cout<<"类B中的函数\n";}
};
void main()
{
	A a1,*p;
	B b1;
	p=&a1; 
	p->fun();    //B行
	p=&b1;
	p->fun();    //C行
}

    程序运行结果:
    类A中的函数
    类B中的函数
    程序基类中A行将函数fun()说明为虚函数,则在类A的派生类B中函数fun()虽然没有用”virtual”修饰,它也为虚函数,在主函数中的B行和C行虽然调用形式相同,但两次调用时指针p所指向的对象不同,因而调用的是不同对象的成员函数,所以其输出也不同。
    在说明和使用虚函数时,应该注意以下几点:
    (1) 虚函数同于不同的有继承关系的类中的相同原型函数(同名,且参数类型,顺序以及个数都相同),仅函数名相同则属于函数的重载;单独的一个虚函数没有实际的意义。
(2) 虚函数的多态性必须通过相同的指针来实现,通过对象名来调用虚函数不能体现虚函数的多态性。一般来说,实现虚函数的多态性是通过基类的指针指向不同的对象来处理虚函数的。
(3) 虚函数是类的成员函数,但不能是静态成员函数,更不能是友元函数。友元函数不是类的成员。
(4) 如果派生类中没有重新定义虚函数,则不能体现虚函数的多态性。
 纯虚函数
    如果基类中的某个函数的功能暂时还不能确定或没有必要先确定,则可以先不具体定义此函数而先将其说明为纯虚函数,其具体实现在派生类中定义。纯虚函数的定义方式是将一个明确了函数原型的虚函数赋以初值0。例如:
#include<iostream.h>
class A{
protected:
	int a;
public:
	A(int x){a=x;}
	virtual void fun(int)=0;  //A行
};
class B:public A{
	int b;
public:
	B(int x,int y):A(y){b=x;}
	void fun(int x)     //B行
	{
		cout<<a+x<<'\n';
		cout<<b+x<<'\n';
	}
};
void main()
{
	A *p;                  //C行
	B b1(2,6);
	p=&b1;
	p->fun(1);             //D行
}

    程序在基类A中将函数void fun(int)定义为纯虚函数(A行)。由于基类A含有纯虚函数,纯虚函数没有具体的实现,所以不能利用它来生成对象,但可以定义一个指向该类的指针,如程序中的C行。
    定义一个纯虚函数,本质上是将一个空指针值0赋给函数名,但该函数的原型必须确定,纯虚函数不同于空函数,空函数有一个空的函数体,虽然它什么都不做,但是它是一个完整的函数,可以调用它。
    程序中派生类B的成员void fun(int)是类A中纯虚函数的实现,它的函数原型必须与上述纯虚函数相同。
    主函数中定义了一个指向基类的指针,然后根据赋值兼容性规则将其指向派生类的对象,在通过它调用了B类中的函数fun,这是运行是的多态性。虽然p指向了派生类的对象,但其形式上还是指向类A的,所以在类A中如果没有相应函数的说明,则程序中D行编译时会出错,只有在运行时才能确定其指向的是对象b1。所以A中的函数fun从语法上将是必须的,但从功能上将又不是必不可少的,没有必要定义其函数的实现,因而将其定义为串虚函数。
(一)
#include<iostream.h>
class A{
	int a,b;
public:
	int sum(int x,int y)
	{return (x+y);}
};
class B:public A{
public:
	int sum(int x,int y)
	{return (x*y);}
};
void main()
{
	A a1,*p;
	B b1;
	p=&a1;
	cout<<p->sum(3,2)<<'\n';
	p=&b1;
	cout<<p->sum(3,2)<<'\n';
	cout<<a1.sum(3,2)<<'\n';
	cout<<b1.sum(3,2)<<'\n';
}

运行结果: 5 5 5 6
(二)
#include<iostream.h>
class A{
	int a,b;
public:
	virtual int sum(int x,int y)
	{return (x+y);}
};
class B:public A{
public:
	int sum(int x,int y)
	{return (x*y);}
};
void main()
{
	A a1,*p;
	B b1;
	p=&a1;
	cout<<p->sum(3,2)<<'\n';
	p=&b1;
	cout<<p->sum(3,2)<<'\n';
	cout<<a1.sum(3,2)<<'\n';
	cout<<b1.sum(3,2)<<'\n';
}

运行结果: 5 6 5 6
分享到:
评论

相关推荐

    C++基础知识总结

    包括类、继承与派生、多态性与虚函数等。如果你原就有一定的C语言基础,这份文档会让你学起C++来事半功倍,当然没有C语言基础的也可学习,因为文档里不仅仅写了二者的区别,也对C++里的函数等做了一个详细的阐述!

    实例讲解C++编程中的虚函数与虚基类

    主要介绍了C++编程中的虚函数与虚基类的实例讲解,虚函数与虚基类的使用是C++入门学习中的基础知识,需要的朋友可以参考下

    c++面向对象基础知识

    这些语法知识,均是C++语言中最基础和常见的语法知识。在介绍语法规则时,通常使用示例形式来说明语法要求。限于形式与篇幅,难以保证涉及所有的细节。尽管如此,本文档中的示例可以作为大家使用相应语法知识编写...

    C++基础复习总结.docx

    C++基础知识总结,涵盖基础概念、基本语法,基础函数如虚函数等用法。

    C++ 虚基类 继承 多态示例

    利用C++计算正方形,矩形,三角形圆形的面积,包含了虚函数,继承,多态相关的基础知识,这是一个示例程序力求简单易懂。代码采用VC6.0建立工程。

    C++基础知识简单汇总_终稿1061

    3.C++有哪些性质(面向对象特点) 1 4.子类析构时要调用父类的析构函数吗 5.多态,虚函数,纯虚函数 1 6.求下面函数的返回值(微软) 1 7.什么是

    c++,继承,多态,虚函数,纯虚函数

    其中是关于c++的重点的概括,没有c++的基础的知识,内容很少,就是关于一些重点知识的一点理解,内容不多,希望对读者有帮助

    C++基础知识简单汇总_终稿106__tagged1

    3.C++有哪些性质(面向对象特点) 1 4.子类析构时要调用父类的析构函数吗 5.多态,虚函数,纯虚函数 1 6.求下面函数的返回值(微软) 1 7.什么是

    传智播客_C++基础课程讲义_v1.0.7

    面试题5:构造函数中调用虚函数能实现多态吗?为什么? c++编译器多态实现原理 6 面试题6:虚函数表指针(VPTR)被编译器初始化的过程,你是如何理解的? 6 面试题7:父类的构造函数中调用虚函数,能发生多态吗? ...

    C++ Beginer&amp;#039;s Guide by Herbert Schildt (C++ 初学者指南)

    第 1 章:C++ 基础知识 第 2 章:数据类型和运算符简介 第 3 章:程序控制语句 第 4 章:数组、字符串和指针 第 5 章:函数简介 第 6 章:进一步了解函数 第 7 章:更多数据类型和运算符 第 8 章:类和对象 第 9 章...

    C++语言基础教程及经典面试题

    C++教程集,ppt格式,讲解C++语言的基本知识:基本数据与表达式、循环结构,数组,类,继承,多态与虚函数,模板等知识,最值得的是c++经典面试100题。

    C++程序设计 谭浩强 电子版,文字版非扫描

    C++C++程序设计 中国高等院校计算机基础教育课程体系规划材 谭浩强 编著 总 目 录 第 1篇 基 本 知 识 第 1章 C++C++C++的初步知识 的初步知识 ...第 12 章 多态性与虚函数 第 13 章 输入出流 第 14 章 C++C++C++

    正宗《Visual C++2008入门经典》中文 高清完整版PDF part5(共6部分)

    本书延续了Ivor Horton讲解编程语言的独特方法,从中读者可以学习Visual C++ 2008的基础知识,了解如何使用MFC进行本地ISO/ANSI C++ Windows应用程序开发以及如何使用Windows Forms进行C++/CLI Windows应用程序开发...

    现代C++程序设计

    第2章 C++的入门知识 2.1 编程基础 2.1.1 算法设计 2.1.2 正确的软件开发步骤 2.2 专业术语及工程创建 2.3 C++程序的一般格式 2.3.1 “Hello World!”程序 2.3.2 “How’s the Weather?”程序 2.4 程序的数据及...

    C++100天经典实战系(含大量案例源码及通俗讲解教程,effective_c++、STL、综合能力全面提升)

    1、C++基础学习 友元函数与友元类、引用与指针那些事、深入浅出C++虚函数的vptr与vtable、宏那些事、范围解析运算符那些事、从初级到高级的enum那些事、纯虚函数和抽象类、volatile、virtual、using、union、this、...

    C++程序设计技能百练(code+exe)

    第1课讲解C++基础知识;第2课讲解数据类型和控制结构;第3课讲解函数;第4课讲解数组和指针;第5课讲解引用与结构;第6课讲解类和对象;第7课讲解堆、构造函数与拷贝构造函数;第8课讲解静态成员、友元与模板;第9课...

    c++语言_游戏编程指南

    第一章 游戏编程必需的 C++基础知识 1.1 概述 1.2 入门知识 1.3 控制语句 1.4 函数 1.5 指针、数组与字符串 1.6 预编译指令 1.7 多文件程序的结构 第二章 游戏编程必需的 C++高级知识 2.1 类的定义和使用 2.2 构造...

    此项目主要是关于C++学习过程的小demo.rar

    如果你只是对c++的相关知识了解的没有那么全面,或者你或多或少遗忘了一部分基础知识,那这篇文章再适合你不过了。如果有问题可以留言。 此demo主要包括三个文件:namespace.h文件,包含了自定义空间、空间函数、...

    C++给出一个哺乳动物类,要求从此派生出一个狗类

    C++中类与继承的知识,给出一个哺乳动物类,要求从此派生出一个狗类狗属哺乳动物,且它的属性有品种之分(在哺乳类基础上增加品种数据成员),叫声区别于其他动物(即Speak()实现为虚函数,输出“Woof!”),还会摇...

    C++反汇编视频教程(代码+课件+视频全套价值300元的付费教程)

    课程面向的学员需要具备 C++ 基础知识,汇编语言则不必很熟练,了解一些常用指令即可。如果您想从事逆向工程和软件保护等领域,那么本套课程将会是很好的入门材料。具体内容包括: 第一讲 基本概念 寄存器 寻址方式 ...

Global site tag (gtag.js) - Google Analytics