64,691
社区成员
发帖
与我相关
我的任务
分享
virtual void print()
{
printf("this is parent \n");
}
因为你父类中写的是虚函数, 你自己类中有继承,所以会调用的子类中的print函数
去掉virtual 你运行看看,
这是回答 1 ,
对于2 还是一样, 谁的对象就是谁的this指针,通过上面的问题,这个也就解释了
[/quote]
非常感谢大哥的回答哈 。就是对这个虚函数有疑问
class a
{
public:
a()
{
this->print();
}
~a()
{}
virtual void print()
{
printf("this is parent \n");
}
};
class b : public a
{
public:
b() : a()
{}
~b()
{}
virtual void print()
{
printf("this is chlid \n");
}
};
void main()
{
b pb;
}
您看着个代码 执行的就是“this is parent” 因为这个this 指针是父类的 所以即使他是虚函数调用的而是自己的a中的函数 和上面的比较 就有问题了
virtual void print()
{
printf("this is parent \n");
}
因为你父类中写的是虚函数, 你自己类中有继承,所以会调用的子类中的print函数
去掉virtual 你运行看看,
这是回答 1 ,
对于2 还是一样, 谁的对象就是谁的this指针,通过上面的问题,这个也就解释了
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;
}
修改后的代码2(RTSPServer构造方法修改后)://#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;
}
代码1对于虚方法的调用时在RTSPServer外部,pa->incomingRequestHandler((RTSPServer*)pa);执行时动态绑定了子类的print方法
而代码2而对于虚方法的调用是在RTSPServer内部,这样incomingRequestHandler(this);最终等同于{this->print();this->print();}也就等同于{print();print();}等同于{printf("this is parent \n");printf("this is parent \n");}了[/quote]
感谢各位的帮助特别是zhctj159哥们,您的回答启发了我 其实这就是this指针的用法问题
当创建DynamicRTSPServer的时候首先调用RTSPServer的构造函数,并将pa的首地址赋值给RTSPServer的this指针。此时的this指针指向pa;当RTSPServer的构造函数结束 再调用DynamicRTSPServer的构造函数,这时pa的内存已经全部初始化完成!
也就是说RTSPServer和DynamicRTSPServer的this指针都是指向pa对象,这样当调用函数的时候自然调用的是
基类的函数了。
这样就不难理解第3个问题了
RTSPServer()
{
fTaskScheduler =new TaskScheduler();
fTaskScheduler->turnOnBackgroundReadHandling(&incomingRequestHandler,this);
fTaskScheduler.singlestep();
}
改成这样 打印的都是“this is parent” 因为RTSPServer()函数还没有结束,DynamicRTSPServer的构造函数还没有调用,this指针的地址还没有包括DynamicRTSPServer的内容,这样执行的都是父类的指针。
哈哈 满意结贴!!!!
再次感谢zhctj159和楼上的各位!找了半天的。基础知识还很不扎实啊//#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;
}
修改后的代码2(RTSPServer构造方法修改后)://#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;
}
代码1对于虚方法的调用时在RTSPServer外部,pa->incomingRequestHandler((RTSPServer*)pa);执行时动态绑定了子类的print方法
而代码2而对于虚方法的调用是在RTSPServer内部,这样incomingRequestHandler(this);最终等同于{this->print();this->print();}也就等同于{print();print();}等同于{printf("this is parent \n");printf("this is parent \n");}了