关于虚函数和this指针的问题
// livetest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
class TaskScheduler
{
public:
TaskScheduler()
{}
~TaskScheduler()
{}
typedef void BackgroundHandlerProc(void* clientData);
public:
void turnOnBackgroundReadHandling(BackgroundHandlerProc* handlerProc, void* clientData)
{
fhandlerProc = handlerProc;
fclientData = clientData;
}
BackgroundHandlerProc* fhandlerProc;
void* fclientData;
void singlestep()
{
(*fhandlerProc)(fclientData);
}
};
TaskScheduler* fTaskScheduler = new TaskScheduler();
class RTSPServer
{
public:
RTSPServer()
{
fTaskScheduler->turnOnBackgroundReadHandling(&incomingRequestHandler,this);
}
~RTSPServer()
{
}
void test()
{
fTaskScheduler->singlestep();
}
public:
static void incomingRequestHandler(void* instance)
{
RTSPServer* server = (RTSPServer*)instance;
server->print();
server->incomingConnectionHandlerRTSP1();
}
void RTSPServer::incomingConnectionHandlerRTSP1()
{
this->print();
}
virtual void print()
{
printf("this is parent \n");
}
};
class DynamicRTSPServer : public RTSPServer
{
public:
DynamicRTSPServer():RTSPServer()
{
}
~DynamicRTSPServer()
{
}
static DynamicRTSPServer* DynamicRTSPServer::createnew()
{
return new DynamicRTSPServer();
}
private:
virtual void print()
{
printf("this is child \n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
RTSPServer* pa;
pa = DynamicRTSPServer::createnew();
fTaskScheduler->singlestep();
return 0;
}
有两个疑问请教大牛们:
1:turnOnBackgroundReadHandling函数传递的指针是RTSPServer的this 怎么打印信息是“this is child”
2:incomingConnectionHandlerRTSP1()函数中this指的不是RTSPServer吗?
3:将RTSPServer()函数改成
RTSPServer()
{
fTaskScheduler =new TaskScheduler();
fTaskScheduler->turnOnBackgroundReadHandling(&incomingRequestHandler,this);
fTaskScheduler.singlestep();
}
fTaskScheduler是RTSPServer的成员变量结果怎就不一样呢??
先感谢各位大牛 本人菜鸟详细点哈 !!!!
[解决办法]
1 你参数传进去的就是把RTSPServer的指针传给了TaskScheduler指针
2 调用的对象是谁,就是谁的this指针,你调用是 RTSPServe对象,
this 指针就是指 RTSPServe
3 只是在 RTSPServe的构造函数中new一个TaskScheduler一个对象而已,
会调用TaskScheduler的构造函数,有那里不一样呢
//#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
class RTSPServer{
public:
RTSPServer(){
//注意1、之前进行的绑定在新版本不需要做
//fTaskScheduler->turnOnBackgroundReadHandling(&incomingRequestHandler,this);
}
~RTSPServer(){}
//void test(){
//fTaskScheduler->singlestep();
//}
public:
static void incomingRequestHandler(void* instance){
RTSPServer* server = (RTSPServer*)instance;
server->print();
server->incomingConnectionHandlerRTSP1();
}
void RTSPServer::incomingConnectionHandlerRTSP1(){
this->print();
}
virtual void print(){
printf("this is parent \n");
}
};
class DynamicRTSPServer : public RTSPServer{
public:
DynamicRTSPServer():RTSPServer(){}
~DynamicRTSPServer(){}
static DynamicRTSPServer* DynamicRTSPServer::createnew(){
return new DynamicRTSPServer();
}
private:
virtual void print(){
printf("this is child \n");
}
};
int _tmain(int argc, _TCHAR* argv[]){
RTSPServer* pa;
pa = DynamicRTSPServer::createnew();
//注意2、调用修改如下
//fTaskScheduler->singlestep();
pa->incomingRequestHandler((RTSPServer*)pa);
return 0;
}
//#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
class RTSPServer{
public:
RTSPServer(){
//注意1、这里既绑定又调用
//fTaskScheduler = new TaskScheduler();
//fTaskScheduler->turnOnBackgroundReadHandling(&incomingRequestHandler,this);
//fTaskScheduler->singlestep();
incomingRequestHandler(this);
}
~RTSPServer(){}
//void test(){
//fTaskScheduler->singlestep();
//}
public:
static void incomingRequestHandler(void* instance){
RTSPServer* server = (RTSPServer*)instance;
server->print();
server->incomingConnectionHandlerRTSP1();
}
void RTSPServer::incomingConnectionHandlerRTSP1(){
this->print();
}
virtual void print(){
printf("this is parent \n");
}
};
class DynamicRTSPServer : public RTSPServer{
public:
DynamicRTSPServer():RTSPServer(){}
~DynamicRTSPServer(){}
static DynamicRTSPServer* DynamicRTSPServer::createnew(){
return new DynamicRTSPServer();
}
private:
virtual void print(){
printf("this is child \n");
}
};
int _tmain(int argc, _TCHAR* argv[]){
RTSPServer* pa;
pa = DynamicRTSPServer::createnew();
//fTaskScheduler->singlestep();//为了比较,这句可以暂且注释
return 0;
}