/*
基類析構函數[是虛函數]:
指向派生類的基類指針在析構的時候
[普通指針,shared_ptr,unique_ptr][都會先調用派生類的析構函數,然后再調用基類的析構函數]
*/
/*
基類析構函數[不是虛函數]:
指向派生類的基類指針在析構的時候
[普通指針,unique_ptr][只會調用基類的析構函數,不會調用派生類的析構函數]
[shared_ptr][會先調用派生類的析構函數,然后再調用基類的析構函數]
*/
#include <iostream>
#include <string>
#include <memory>
class BaseA
{
int data;
std::string msg;
public:
BaseA() {
msg="BaseA message";
}
/*
~BaseA() {
std::cout<<__FUNCTION__<<std::endl;
}
*/
virtual ~BaseA() {
std::cout<<__FUNCTION__<<std::endl;
}
virtual void show_msg() {
std::cout<<msg<<std::endl;
}
};
class DeriveA:public BaseA
{
int data;
std::string msg;
public:
DeriveA() {
msg="DeriveA message";
}
~DeriveA() {
std::cout<<__FUNCTION__<<std::endl;
}
void show_msg() {
std::cout<<msg<<std::endl;
}
};
void UsePrivateFunc() {
{
std::cout<<"ptr BaseA:"<<std::endl;
BaseA* ptr_BaseA(new DeriveA());
ptr_BaseA->show_msg();
delete ptr_BaseA;
}
std::cout<<"\n";
{
std::cout<<"unique_ptr BaseA:"<<std::endl;
std::unique_ptr<BaseA> uptr_BaseA(new DeriveA());
uptr_BaseA->show_msg();
}
std::cout<<"\n";
{
std::cout<<"shared_ptr BaseA:"<<std::endl;
std::shared_ptr<BaseA> sptr_BaseA(new DeriveA());
sptr_BaseA->show_msg();
}
}
int main(int argc,char* argv[])
{
UsePrivateFunc();
return 0;
}
析構函數是虛函數的輸出結果:

析構函數不是虛函數的輸出結果:
