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

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

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*);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值