关于子类重写父类方法,并在构造函数中调用的问题

tiankongzhiyu5141 2020-07-13 11:26:08
我创建 了一个父类Server,里面有一个方法server_poll,在Server的构造函数内调用。

然后我继承Server,并创建了一个子类process_sub_1,然后重写了方法server_poll,期望process_sub_1在创建对象时,构造函数会调用我新重写过的process_sub_1::server_poll。

然而在实际调试的时候,创建process_sub_1对象调用构造函数,不会使用process_sub_1::server_poll,而是依然使用了Server::server_poll

请问各位帮忙看看我的代码,应该如何改进




具体的工程保存在网盘中,在ubuntu下使用cmake编译,具体看代码readme

网盘链接: https://pan.baidu.com/s/1UhyfD7ORK-4FeOvYHL-AZA
提取码: d63q



Server类的定义

class Server {

public:
pid_t pid;

eServer service_id;
char name[MY_PID_NAME_LEN];

//子类继承重写
void server_init(void* par, uint32_t len){}
void server_poll(void){}

Server(eServer id, void* par, uint32_t len);
~Server();

static Server* install(eServer id, void* par, uint32_t len);
static Server* self;

};


以下为Server类的构造函数
Server::Server(eServer	id, void* par, uint32_t len) {

uint8_t i = 0;
pid_t pid = fork();

this->service_id = id;
bzero(this->name, MY_PID_NAME_LEN);
len = strlen(mServiceName[this->service_id]);
if (len > MY_PID_NAME_LEN) {
len = MY_PID_NAME_LEN;
}

memcpy(name, mServiceName[this->service_id], MY_PID_NAME_LEN);

if (pid > 0) { //父进程,返回值为子进程的pid
this->pid = pid;
return ;
}

else if (pid == 0) {//子进程,返回值为0

int ret = 0;

//修改新进程的名字
prctl(PR_SET_NAME, this->name, NULL, NULL, NULL);

//获取自己的PID
this->pid = getpid();

//应用初始化,这里由子类重写
this->server_init(par, len);

//应用业务循环,这里由子类重写,应该写成死循环
this->server_poll();

printf(" Warning!!! \n");
exit(EXIT_FAILURE);

}
else {
printf(" Warning!!! \n");
return ;
}


}




以下为process_sub_1 类的定义
class process_sub_1 :public Server {
private:
void server_init(void* par, uint32_t len);
void server_poll(void);

public:
process_sub_1(eServer id, void* par, uint32_t len):Server(id, par, len){

}

};


process_sub_1 类的实现
#include "process_sub_1.h"

void process_sub_1::server_init(void* par, uint32_t len) {

}

void process_sub_1::server_poll(void) {

while (1) {
printf("process_sub_1\n");
usleep(1000 * 2000);
}

}




main主函数:


int main(void) {
process_sub_1::install(eSubService1, NULL, 0);
while (1) {
sleep(1);
}
}





最终的测试结果:

ubuntu# ./bin/my_test
Server
Server



...全文
237 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
sdghchj 2020-07-14
  • 打赏
  • 举报
回复
代码看不到一个virtual关键字,还重写? 即便重写了虚函数,在构造函数里调用也没多态效果。 改进就是用独立于构造函数之外的一个函数来处理。
真相重于对错 2020-07-14
  • 打赏
  • 举报
回复
请看Efficient C++中的解释
真相重于对错 2020-07-14
  • 打赏
  • 举报
回复
不要在构造函数里面调用虚函数。

65,179

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧