首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个C++执行过程 关于杜撰函数

2014-01-03 
一个C++执行过程 关于虚拟函数代码如下:主函数中调用了a.fun1(&b)将对象b的地址传递给函数对象a的fun1函

一个C++执行过程 关于虚拟函数
代码如下:




主函数中调用了a.fun1(&b);将对象b的地址传递给函数对象a的fun1函数,

然后开始执行函数a.fun1(animal *maybedog_maybehorse),此处fun1的形参是一个animal类型的指针。

用这个指针存储对象b的地址。

问题一:a.fun1函数内容是maybedog_maybehorse->born(); 是不是代用了对象b的born函数??????

问题二:类animal 和类horse中都有成员函数born,类horse公开继承了类animal。那么这两个born函数有什么关系吗。

问题三:两个类(animal和 horse)中的born 都是 虚函数。此处虚函数起到一个什么作用呢?

无知小白问了一个简答问题,还望各位大牛给点帮助。

谢谢

[解决办法]
There is no iostream.h in C++ standard, should be:

#include <iostream>
using namespace std;
 
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

[解决办法]
问题一:调试就知道了啊
问题二:同名函数,功能性肯定是有相似的地方,但是这里是override的一个例子
问题三:去看看虚函数那一章

[解决办法]
问一:你都已经运行过了,控制台上已经说的非常清楚了,到底调用了谁的born函数,所以这个问题实在很没水平。
问二/问三:你应该去百度下什么是虚函数。我这里就先简单说明下。
首先虚函数值对指针和引用有效,你的例子中用的就是指针。


void animal::fun1(animal *maybedog_maybehorse)
{
    maybedog_maybehorse->born(); //这里的maybedog_maybehorse是基类animal的指针。但具体调用基类animal的born还是子类horse的born主要看maybedog_maybehorse是用什么构造的。本例中你实际传入的参数是horse的指针,所以它调用的就是horse的born。要出现以上特性,就必须在基类的同名函数上加上virtual关键字。子类的同名函数born其实加不加这个关键字都可以。
}


再举个具体的例子

struct Base
{
   virtual void foo() const {};
}

struct Derive : Base
{
   void foo() const {};
}

int main()
{
   Base * B = new Base;
   Base * D = new Derive;
   B -> foo(); //这个调用的就是Base的foo
   D -> foo(); //这个调用的就是Derive的foo,虽然它和B同样都是指向Base的指针。
   return 0;
}

热点排行