虚函数和纯虚函数的区别
来源:互联网 发布:网络自制穿越剧 编辑:程序博客网 时间:2024/04/29 02:22
在面向对象的C++语言中,虚函数(virtual
那么,什么是虚函数呢,我们先来看看微软的解释:
虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。
——摘自MSDN
这个定义说得不是很明白。MSDN中还给出了一个例子,但是它的例子也并不能很好的说明问题。我们自己编写这样一个例子:
#i
#i
class
{
public:
}parent;
void
{
}
void
{
}
class
{
}
void
{
}
void
{
}
int
{
}
用任意版本的Visual
This
This
为什么会有第一行的结果呢?因为我们是用一个Parent类的指针调用函数Fuction1(),虽然实际上这个指针指向的是Child类的对象,但编译器无法知道这一事实(直到运行的时候,程序才可以根据用户的输入判断出指针指向的对象),它只能按照调用Parent类的函数来理解并编译,所以我们看到了第一行的结果。
那么第二行的结果又是怎么回事呢?我们注意到,Function2()函数在基类中被virtual关键字修饰,也就是说,它是一个虚函数。虚函数最关键的特点是“动态联编”,它可以在运行时判断指针指向的对象,并自动调用相应的函数。如果我们在运行上面的程序时任意输入一个非c的字符,结果如下:
This
This
请注意看第二行,它的结果出现了变化。程序中仅仅调用了一个Function2()函数,却可以根据用户的输入自动决定到底调用基类中的Function2 还是继承类中的Function2,这就是虚函数的作用。我们知道,在MFC中,很多类都是需要你继承的,它们的成员函数很多都要重载,比如编写MFC应用程序最常用的CView::OnDraw(CDC*)函数,就必须重载使用。把它定义为虚函数(实际上,在MFC中OnDraw不仅是虚函数,还是纯虚函数),可以保证时刻调用的是用户自己编写的OnDraw。虚函数的重要用途在这里可见一斑。
再看下面的
-----------------------------------------------------------
上一篇:为何析构函数中的cout不起作用
摘自:C++中虚函数和纯虚函数的概念,差别和分别存在的原因
首先:强调一个概念
定义一个函数为虚函数,不代表函数为不被实现的函数
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数
定义一个函数为纯虚函数,才代表函数没有被实现
定义他是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
对继承的影响:
普通的类(没有虚函数,纯虚函数)就可以被继承,而且工作的相当好
关于这个问题有以下疑问:
纯虚函数难道就是为了实现接口?接口存在的意义?
我实在弄不懂,我干嘛要预先定义好?未来的事情本难料
就等有一天我的类中需要使用某个函数,在添加一个函数
不久可以?
关于实例化一个类:
有纯虚函数的类是不可能生成类对象的,如果没有纯虚函数则可以。比如:
class
{
public:
};
class
{
public:
};
//
...
void
{
}
---------------------------------------------------------------
虚函数在多态中间的使用:
多态一般就是通过指向基类的指针来实现的。
dog
mydogwangwang.born();
一定是返回“dog”
那么
horse
myhorsepipi.born();
一定是返回“horse”
也是多态呀?
/////////////////////////////////////////////////
有一点你必须明白,就是用父类的指针在运行时刻来调用子类:
例如,有个函数是这样的:
void
{
}
参数maybedog_maybehorse在编译时刻并不知道传进来的是dog类还是horse类,所以就把它设定为animal类,具体到运行时决定了才决定用那个函数。
也就是说用父类指针通过虚函数来决定运行时刻到底是谁而指向谁的函数。
////////////////////////////////////////////////////////////////////
//用虚函数
#include
class
{
public:
};
void
{
}
animal::animal()
{
}
animal::~animal()
{
}
void
{
}
class
{
public:
};
dog::dog()
{
}
dog::~dog()
{
}
void
{
}
class
{
public:
};
horse::horse()
{
}
horse::~horse()
{
}
void
{
}
void
{
}
//output:
/////////////////////////////////////////////////////////////////
//不用虚函数
#include
class
{
public:
};
void
{
}
animal::animal()
{
}
animal::~animal()
{
}
void
{
}
class
{
public:
};
dog::dog()
{
}
dog::~dog()
{
}
void
{
}
class
{
public:
};
horse::horse()
{
}
horse::~horse()
{
}
void
{
}
void
{
}
//output:
---------------------------------------------------------------
有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。
---------------------------------------------------------------
定义纯虚函数就是为了让基类不可实例化化,
因为实例化这样的抽象数据结构本身并没有意义.
或者给出实现也没有意义
实际上我个人认为纯虚函数的引入,是出于两个目的,
1.为了安全.因为避免任何需要明确但是因为不小心而导致的未知的结果.
2.为了效率,不是程序执行的效率,而是为了编码的效率.
- 虚函数和纯虚函数的区别 虚函数和纯虚函数的区别
- 虚函数和纯虚函数区别
- 虚函数和纯虚函数区别
- 虚函数和纯虚函数区别
- 虚函数和纯虚函数区别
- 虚函数和纯虚函数的区别
- 虚函数和纯虚函数的区别
- 虚函数和纯虚函数的作用与区别
- 虚函数和纯虚函数的区别
- 虚函数和纯虚函数的区别
- C++虚函数和纯虚函数的区别
- 虚函数和纯虚函数的作用与区别
- 虚函数和纯虚函数的区别
- 虚函数和纯虚函数的区别
- 纯虚函数和虚函数的区别
- 虚函数和纯虚函数的区别
- C++虚函数和纯虚函数的区别
- 虚函数和纯虚函数的区别
- 750光年外发现最黑行星:不反光比炭还黑
- QtWebkit中浏览器插件的设计
- List Operation Performance
- 百度搜索的嵌入代码
- mshtml与System.Windows.Forms.HtmlElement
- 虚函数和纯虚函数的区别
- 关于 wcout 输出中文的问题
- 日照“十二五”末有望实现社会保障“一卡通”
- linux下java调用shell和windows下java调用bat
- 【汇编】重写0号中断(除法溢出中断)
- This Vuser already started a transaction with the same name...解决方法
- 两匹马驾驶的线程车
- 我的10个开发原则
- [评论]为什么谷歌要执行严格的代码编写规范