继承和虚函数在NS2中的应用(更好地理解累的继承)

来源:互联网 发布:英雄联盟关注软件 编辑:程序博客网 时间:2024/05/21 10:35

派生类继承基类中除构造和析构函数以外的所有成员。

class  A  { public:  virtual void foo() { cout<<"A::foo() is called"<<endl;  } };  class B : public A  { public:  void foo()  { cout<<"B::foo() is called"<<endl; } };  int main(void)  { A *a = new B();  a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! 基类的指针调用子类的foo函数 return 0;  }

NS2中的虚函数:

class UWALOHA: public UnderwaterMac{public:UWALOHA();int  command(int argc, const char*const* argv);void TxProcess(Packet* pkt);void RecvProcess(Packet* pkt);......}

class UnderwaterMac: public Mac {public:UnderwaterMac();double  bit_rate_; double  encoding_efficiency_; virtual   void RecvProcess(Packet*);virtual  void TxProcess(Packet*);......}

上面的代码显示:uwaloha 类继承自 underwatermac 类;

如果通信网络使用的是 uwaloha 协议,那么:

1、if(direction == hdr_cmn::DOWN)

(1)如果接收到来自上层的包,需要传往下层时(上层 -> 下层):

会调用uwaloha 的 recv() 函数,但由于uwaloha.cc中没有定义 recv() 函数,而基类 underwatermac 中定义了此函数,因此,会调用underwatermac.cc 中的 recv() 函数。recv() 函数进而调用 TxProcess( )函数

(2)由于协议使用的是 uwaloha 协议,因此, underwatermac.cc 中的 recv() 函数会调用派生类 uwaloha中的 TxProcess( )函数


(3)因此,TxProcess()函数在基类underwatermac.h中被声明为虚函数,如下所示:

virtual  void TxProcess(Packet*);


2、如果接收到来自下层的包,需要传往上层时(下层 -> 上层):

(1)s.schedule(&recv_handler,p,txtime); 会在txtime时间之后(完全接收完包之后),调用recv_handler,

会调用uwaloha 的 recv() 函数,但由于uwaloha.cc中没有定义 recv() 函数,而基类 underwatermac 中定义了此函数,因此,会调用underwatermac.cc 中的 recv() 函数。recv() 函数进而调用 RecvProcess( )函数

(2)由于协议使用的是 uwaloha 协议,因此, underwatermac.cc 中的 recv() 函数会调用派生类 uwaloha中的 RecvProcess( )函数

(3)因此,RecvProcess()函数在基类underwatermac.h中被声明为虚函数,如下所示:

virtual   void RecvProcess(Packet*);


阅读全文
0 0
原创粉丝点击