社区
C++ 语言
帖子详情
小弟刚学C++,但始终搞不清楚虚函数的原理,请各位指教!!!谢谢!!!
matomypt
2003-12-12 12:13:44
小弟刚学C++,但始终搞不清楚虚函数的原理,请各位指教!!!谢谢谢!!!
...全文
66
19
打赏
收藏
小弟刚学C++,但始终搞不清楚虚函数的原理,请各位指教!!!谢谢!!!
小弟刚学C++,但始终搞不清楚虚函数的原理,请各位指教!!!谢谢谢!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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++
之
虚函数
小解
通过一个例子讲解下,
小弟
对
虚函数
的理解,例子代码如下:class A{ public: void print(){ cout}; class B:public A{ public: void print(){ cout}; void main(){A a; B b; a.print(); b.print(); }这段代码很显然输出的结果是:This is AThis is
C++
多继承动态交叉转换dynamic_cast
1. 问题简述: 有如下源代码: Class BaseA; Class BaseB; Class SubClass:public BaseA,public BaseB { ... } 现有如下变量定义: BaseA* insA = new SubClass(...); BaseB* insB;
请
问如何将insA指向的对象正确赋值给BaseB
c++
,C#,java中的类
C++
:1、 纯
虚函数
: 纯
虚函数
是一种特殊的
虚函数
,它的一般格式如下: class类名 > { virtual 类型 >函数名 >(参数表 >)=0; …… }; 一般情况下可将一个成员函数在基类中声明为纯
虚函数
,其实现在派生类中完成。 2、抽象类: 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较
C++
多态多重继承与虚继承结合时对内存布局(sizeof)的影响
参考文献:《深度探索
C++
对象模型》 https://bbs.csdn.net/topics/390083150 https://blog.csdn.net/u011841639/article/details/39156347 运行平台:Visual Studio 2015(32bits) 我在上一篇博客...
C++
对象模型笔记:dynamic binding
C++
对象模型笔记:dynamic binding 编译器对于多态的实现是怎样的呢?下面
请
看一个例子: Class Point{Public:Virtual void print();……}; Class Point2D : public Point{Public:Virtual
C++ 语言
64,663
社区成员
250,516
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章