您的位置:首页 > 其它

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

2017-09-06 16:50 363 查看
派生类继承基类中除构造和析构函数以外的所有成员。

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*);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  虚函数 继承