请问关于虚函数
什么是虚函数,具体应用怎样?
请高手指教。
问题点数:20、回复次数:21Top
1 楼herrycsdn(卓一凡)回复于 2003-11-02 09:30:35 得分 0
C++为实现晚捆绑,而使用虚函数,
我觉得你还是找本c++的书,看看比较好Top
2 楼yufeng1979(独行者)回复于 2003-11-02 09:39:31 得分 0
Classes are abstract classes if they contain pure virtual functions or if they inherit pure virtual functions and do not provide an implementation for them. Pure virtual functions are virtual functions declared with the pure-specifierTop
3 楼BestYunnan201(毛主席教导我们:好好学习,天天向上)回复于 2003-11-02 09:43:25 得分 0
关于这个问题要说的真是太多了,三言两语是说不完的!
找本书看好了Top
4 楼chinayang9(中国杨)回复于 2003-11-02 09:46:06 得分 0
我现在手上是有书的,但觉得自己比较适合那种用实例或者听人讲解的学习方法。
能不能给出一个虚函数的例子啊?Top
5 楼BestYunnan201(毛主席教导我们:好好学习,天天向上)回复于 2003-11-02 10:04:23 得分 7
虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
虚函数“虚”就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
例如:
class A
{
public:
virtual void foo() { cout << "A::foo() is called" << endl;}
};
class B: public A
{
public:
virtual void foo() { cout << "B::foo() is called" << endl;}
};
在使用的时候,我们可以这样:
A * a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
//有了虚函数它就不会去调用A了
Top
6 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-02 17:12:26 得分 4
class Base
{
void F(){}
virtual void VF(){}
};
class Derived
:public Base
{
void F(){}
void VF() {}
};
int main()
{
Base * pb = new Derived;
pb->F();
pb->VF();
}
单步调试一下就明白Top
7 楼angelface(§<@#$&^%$>§)回复于 2003-11-02 20:14:37 得分 0
真的还是找本书好好看看吧, 这个问题, 在这里真的是说不清,Top
8 楼snwcwt(风舞影天)回复于 2003-11-02 21:27:42 得分 0
楼主学习方法没对,自学能力太差了Top
9 楼skywolf8183(天狼星)回复于 2003-11-02 21:38:52 得分 0
C++得多态,就是表现在许函数上面,可以说,不懂虚函数的人,就不懂的C++
在继承中,字类继承父类,会自动生成一个父类函数的拷贝,此时在自类中生成的对象,如何正确调用需要的函数呢?
虚函数的出现,函数可以出现了多个版本的拷贝,这样就不会出现在继承中的调用函数的2异性,达到多态的特征。可以参考thing in c++
Top
10 楼boluoCTO(菠萝项目经理)回复于 2003-11-02 23:27:07 得分 0
找本书看看迟后联编是怎么回事就知道了.Top
11 楼panzhaoping(潘赵平)回复于 2003-11-03 01:05:59 得分 0
参见 inside c++ object lippermanTop
12 楼GameWeaver(大白菜)回复于 2003-11-06 12:57:46 得分 4
虚函数定义:
如果一个函数被定义为虚函数,那么即使是使用指向基类对象的指针来调用该成员函数,C+也能保证所调用的是正确的特定于实际对象的成员函数。
示例:
calss A
{
public:
virtual void Display()
{
cout<<"A"<<endl;
}
};
class B:public A
{
virtual void Display()
{
cout<<"B"<<endl;
}
}
void main()
{
A *pA;
pA = new B;
pA->Display();
cin.get();
delete pA;
}Top
13 楼GameWeaver(大白菜)回复于 2003-11-06 13:38:48 得分 0
纯虚函数:
一个不仅可以被重新定义,而且必须被重新定义的成员函数成为纯虚函数,只需给虚函数制定一个0值(更有效说法是一个空指针),就可将虚函数转化成纯虚函数。
当一个类含有至少一个纯虚函数时,这个类就成为抽象类,无法用该类来建立对象。
示例代码:
calss A
{
public:
virtual void Display()=0;
};Top
14 楼Iverson_0(小春)回复于 2003-11-06 14:52:26 得分 0
vtable是虚函数的关键Top
15 楼woxihuanbohe(我喜欢)回复于 2003-11-06 15:07:49 得分 0
虚拟函数需要在继承体系中才有效,通过vtable维护,对象通过vtable调用到对应的函数。Top
16 楼mituzhishi(慎独)回复于 2003-11-06 15:09:53 得分 0
还是找本书好好看看吧!Top
17 楼bing_huo(我是一个演员!)回复于 2003-11-06 15:25:05 得分 5
#include <iostream>
using namespace std;
class A
{
public:
virtual void test(){cout<<"test in class A"<<endl;}
};
class B :public A
{
public:
void test(){cout<<"test in class B"<<endl;}
};
void fun(A *p)
{
p->test();
};
void main()
{
A *pA;
A a;
*pA =&a;
B b;
*pA =&b;
fun(pA);
}
楼主运行一下上面的例子,这个就是最简单的多态,函数fun(A *p)接受一个base类的指针,但是却能根据运行时这个指针所指向的具体对象来确定调用哪个版本的test()函数,这就是楼上说的晚绑定或者叫迟后联编,这也是面向对象程序设计最基本的东西。
Top
18 楼bing_huo(我是一个演员!)回复于 2003-11-06 15:26:16 得分 0
void main()
{
A *pA;
A a;
pA =&a;
fun(pA);
B b;
pA =&b;
fun(pA);
}
main函数里有错误 更正
Top
19 楼hamlet2003(哈姆莱特)回复于 2003-11-06 16:05:00 得分 0
通过vtable实现对衍生函数的间接呼叫。
参看《深入浅出mfc>>Top
20 楼zcnaonao(上帝不爱我)回复于 2003-11-06 20:07:43 得分 0
随便去个书店找本c++基础书,看上他半个小时基本上就差不多懂了Top
21 楼codewarrior(会思考的草)回复于 2003-11-06 20:17:00 得分 0
回去看书再来Top




