我創建 了一個父類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
uj5u.com熱心網友回復:
不要在建構式里面呼叫虛函式。uj5u.com熱心網友回復:
請看Efficient C++中的解釋uj5u.com熱心網友回復:
代碼看不到一個virtual關鍵字,還重寫?即便重寫了虛函式,在建構式里呼叫也沒多型效果。
改進就是用獨立于建構式之外的一個函式來處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/29368.html
標籤:C++ 語言
上一篇:救救孩子嗚嗚,大一題目明天就交了
