继承和虚函数在NS2中的应用(更好地理解累的继承)
2017-09-06 16:50
363 查看
派生类继承基类中除构造和析构函数以外的所有成员。
NS2中的虚函数:
上面的代码显示: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*);
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*);
相关文章推荐
- 理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承
- 对类的继承的理解与应用:赋值兼容性原则
- 理解继承、虚函数与多态
- javascript权威指南第五版 读后有感!!(读这本书之后的一些理解,和恍然大悟的感觉)包括闭包,继承和应用
- C++类内存分布——深度理解继承与虚函数
- 继承与派生、运算符的重载、虚函数的应用
- CSS教程:理解继承属性及应用
- 继承,虚函数应用,对象向量
- mfc 序列化类(串行化类)的继承和虚函数应用
- C++中虚函数的理解,以及简单继承情况下的虚函数的表!
- 理解SQLAlchemy的表继承关系(4)--高级应用
- 理解虚函数,多重继承,虚基类和RTTI所需的代价
- 简单理解C++的多态公有继承及虚函数
- c#继承的理解与应用
- 如何更好地理解和应用ITIL 推荐
- 地图API的理解和应用-笔记
- iOS开发中关于继承、扩展和协议的理解
- NS2中最全的无线Trace格式--较易理解
- C++中理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异(11)---《More Effective C++》
- 理解Flux机制和应用