小弟刚学C++,但始终搞不清楚虚函数的原理,请各位指教!!!谢谢!!!

matomypt 2003-12-12 12:13:44
小弟刚学C++,但始终搞不清楚虚函数的原理,请各位指教!!!谢谢谢!!!
...全文
47 19 打赏 收藏 举报
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wawxj1314 2004-03-25
realjustin(夜海星空)
你的程序实现不了
请检查
呵呵
  • 打赏
  • 举报
回复
realjustin 2004-01-10
动态联编:
一般函数都是在编译时就已经确定了执行什么那段代码了(静态联编),而动态联编则是指在
运行时才知道执行那段代码,那个函数;
例如:

#include "stdafx.h"
#include "iostream.h"
#include <time.h>
#include <stdlib.h>



int h()
{
return 7;
}

int m()
{
return 9;
}

int main()
{
int (* f)();

srand( (unsigned)time( NULL ) );

for(int i=0;i<10;i++)
{
if(rand()%2 )
f = m;
else
f= h;

cout<<"你好:" << (*f)()<<endl;
}

}

//执行的结果是什么呢??这就是动态联编
  • 打赏
  • 举报
回复
realjustin 2004-01-10
虚函数的产生主要是为了解决C++的动态连编,以产生多态。
1、如果一个类中有虚函数,那么他就会有一个虚函数列表(在类前边,或类后,与编译器有关系,不去管它),虚函数列表就是一个函数指针的列表,在执行的时候因不同的执行指向不同的函数,从而实现了动态连编的效果。
2、当父类的指针指向了其子类的对象时,子类的虚函数表会覆盖掉父类的虚函数表,从而执行的时候执行的是子类的虚函数,而不是父类的函数,实现了子类真正的覆盖了父类的函数。
例如:
class A
{
int i;
public :
virtual comm(){count<<"rst :A"<<endl;}
}
class B:A
{
int j;
public:
virtual comm(){count<<"rst :B"<<endl;}
}
main()
{
A* a;
B b;
a= &b;
a-> comm();
}

//会输出::rst :B

//去掉了 virtual 就会输出:rst :A
  • 打赏
  • 举报
回复
computer386 2004-01-08
看多了自然就明白了!!!!!!!!!
我当时也和你一样!!!!!!!!!!!!!!!!!!!!!
  • 打赏
  • 举报
回复
sunwt 2004-01-08
关于动态联编,请在google上搜索"linkers and loaders"
  • 打赏
  • 举报
回复
green405 2004-01-07
虚函数,个类虚就虚在所谓“推迟联编”或者“动态联编”上,一函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
不是很明什么是“动态联编”?看完楼上的资料,还是不明,能进一步解析吗?谢谢
  • 打赏
  • 举报
回复
ambition2005 2003-12-15
这个问题太大了,不是一点能讲完的,楼主找本书看看啊

c++ primer也不错
  • 打赏
  • 举报
回复
knightmsn 2003-12-15
建议看thinking in c++,相当好的书
  • 打赏
  • 举报
回复
Edison621 2003-12-12
看書
錢能的《C++程序設計》不錯
當然﹐有興趣看些英文原版圖書的更好
  • 打赏
  • 举报
回复
layman2008 2003-12-12
http://www.vckbase.com/document/viewdoc.asp?id=939

给你个地址,自己去看看吧
  • 打赏
  • 举报
回复
BenWong1981126 2003-12-12
每一个类有个相应的虚函数表,这是调用virtual 函数的关键
类把自己定义为virtual 类型的函数指针填入该表中,
继承类也继承了这个表,在定义自己的virtual 函数时候,把属于自己的v函数的指针也填到表里面去了
这样,在每个类调用自己的v 函数时就有不同的版本,这是polymorphism实现的机制吧。

请指教
  • 打赏
  • 举报
回复
redhat_xu 2003-12-12
虚函数一般用于动态联编
所以联编一般分为静态联编和动态联编
动态联编在编译之前就已经虚函数加入到相应的代码处.
  • 打赏
  • 举报
回复
laker_tmj 2003-12-12
up learn
  • 打赏
  • 举报
回复
glacierrr 2003-12-12
虚函数主要注意的就是其动态绑定,在执行时才知道调用那个具体的函数。
  • 打赏
  • 举报
回复
boy8765 2003-12-12
标记一下
  • 打赏
  • 举报
回复
redhat_xu 2003-12-12
首先必须知道虚函数是干什么用的,
一般来说虚函数是为了解决子类继承父类的成员函数后又
不完全与父类的成员函数的功能相同,故将其父类的成员函数设为虚函数,供在子类中
重新定义,从而体现多态的作用。即虚函数可以对父类的成员函数进行改写。当然只能
在当前类中使用。
下面举个简单例子:
class A
{
int i;
public:
A(int m)
{ i=m;
}
~A(){}
virtual void fun()
{ cout <<i<< endl;}
};
class B: public A
{
int j;
public:
B(int n){
j=n;}
~B(){}
virtual void fun()
{ cout <<j<< endl;}
};
void main()
{
A a(2);
B b(3);
a.fun();
b.fun();
}
输出结果为:2和3,
以上就是虚函数的使用方法。
  • 打赏
  • 举报
回复
lsq2008 2003-12-12
虚函数用于实现多态,所有的C++的书籍都会讲这方面的内容的!!!
  • 打赏
  • 举报
回复
李宠波 2003-12-12
来这里看看,有好多免费书下载的,不乏经典之作:
http://expert.csdn.net/Expert/topic/1583/1583456.xml?temp=.8206903
祝你马到成功!
  • 打赏
  • 举报
回复
leyt 2003-12-12
候捷的书里面也有讲解
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.1w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2003-12-12 12:13
社区公告
暂无公告