【C++】Virtual method but non-virtual destructor

本文介绍了一个包含纯虚函数的基类和派生类的实现方式,并强调了虚析构函数的重要性。通过示例代码展示了如何正确地定义虚函数和虚析构函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有虚函数(纯虚函数)就应该有虚析构函数。



class Base
{
public:
virtual void func() = 0;
virtual ~Base() {}; // 注意,有{}实现
};

class Child : public Base
{
public:
void func()
{
};

~Child(){ ... };
}


特记录下来。
atk@atk-virtual-machine:~/RV1126/alientek_sdk_0519/IPCOnvif$ make [ 5%] Building CXX object CMakeFiles/IPCOnvif.dir/src/IPCManager.cpp.o In file included from /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:1: /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/include/IPCManager.h:61:21: error: ‘OnvifClient’ was not declared in this scope 61 | std::unique_ptr<OnvifClient> onvifClient_; | ^~~~~~~~~~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/include/IPCManager.h:61:32: error: template argument 1 is invalid 61 | std::unique_ptr<OnvifClient> onvifClient_; | ^ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/include/IPCManager.h:61:32: error: template argument 2 is invalid /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp: In constructor ‘IPCManager::IPCManager()’: /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:10:36: error: ‘OnvifClient’ was not declared in this scope; did you mean ‘onvifClient_’? 10 | onvifClient_ = std::unique_ptr<OnvifClient>(new OnvifClient()); | ^~~~~~~~~~~ | onvifClient_ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:10:47: error: template argument 1 is invalid 10 | onvifClient_ = std::unique_ptr<OnvifClient>(new OnvifClient()); | ^ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:10:47: error: template argument 2 is invalid /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:10:53: error: expected type-specifier before ‘OnvifClient’ 10 | onvifClient_ = std::unique_ptr<OnvifClient>(new OnvifClient()); | ^~~~~~~~~~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp: In destructorvirtual IPCManager::~IPCManager()’: /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:15:18: error: request for member ‘reset’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 15 | onvifClient_.reset(); | ^~~~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp: In member function ‘bool IPCManager::initIPC()’: /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:32:22: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 32 | if (onvifClient_.get() == NULL) | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:41:52: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 41 | std::vector<std::string> ipList = onvifClient_.get()->SearchIpc(); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:55:21: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 55 | ret = onvifClient_.get()->Init(this->ip, this->username, this->password); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:68:21: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 68 | ret = onvifClient_.get()->GetDeviceInfo(Manufacturer, SerialNumber, Model); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:79:24: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 79 | ret = onvifClient_.get()->Capabilities(); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:88:21: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 88 | ret = onvifClient_.get()->GetMediaProfile(); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp: In member function ‘std::vector<std::__cxx11::basic_string<char> > IPCManager::get_ipc_rtsp_url(const char*, const char*, const char*)’: /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:110:22: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 110 | if (onvifClient_.get() == NULL) | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:125:31: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 125 | m_rtspUrlList = onvifClient_.get()->GetStreamUri(); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp: In member function ‘bool IPCManager::ipc_zoom_in(const char*, const char*, const char*, float)’: /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:149:22: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 149 | if (onvifClient_.get() == NULL) | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:164:24: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 164 | ret = onvifClient_.get()->PtzControl("zoom_in", speed); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:173:24: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 173 | ret = onvifClient_.get()->PtzStop(); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp: In member function ‘bool IPCManager::ipc_zoom_out(const char*, const char*, const char*, float)’: /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:195:22: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 195 | if (onvifClient_.get() == NULL) | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:210:24: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 210 | ret = onvifClient_.get()->PtzControl("zoom_out", speed); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:219:24: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 219 | ret = onvifClient_.get()->PtzStop(); | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp: In member function ‘bool IPCManager::ipc_ptz_stop()’: /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:237:22: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 237 | if (onvifClient_.get() == NULL) | ^~~ /home/atk/RV1126/alientek_sdk_0519/IPCOnvif/src/IPCManager.cpp:242:24: error: request for member ‘get’ in ‘((IPCManager*)this)->IPCManager::onvifClient_’, which is of non-class type ‘int’ 242 | ret = onvifClient_.get()->PtzStop(); | ^~~ make[2]: *** [CMakeFiles/IPCOnvif.dir/build.make:63:CMakeFiles/IPCOnvif.dir/src/IPCManager.cpp.o] 错误 1 make[1]: *** [CMakeFiles/Makefile2:76:CMakeFiles/IPCOnvif.dir/al
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值