派生类继承基类中除构造和析构函数以外的所有成员。
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*);