我们假设我有两个类:
class Base{};
class Derived: public Base{};
Run Code Online (Sandbox Code Playgroud)
没有d tor,在这种情况下如果我声明变量:
Base b;
Derived d;
Run Code Online (Sandbox Code Playgroud)
我的编译器会为我生成,我的问题是,默认的b and d
是否是虚拟的?
sbi*_*sbi 10
我的问题是,b和d的d将是虚拟的还是非虚拟的
不,他们不会.如果你想要一个虚拟析构函数,你必须定义自己的析构函数,即使它的实现与编译器提供的实现完全相同:
class Base {
public:
virtual ~Base() {}
};
Run Code Online (Sandbox Code Playgroud)
破坏者Base
和Derived
将来的破坏者virtual
.要构建virtual
析构函数,您需要明确标记它:
struct Base
{
virtual ~Base() {}
};
Run Code Online (Sandbox Code Playgroud)
实际上现在只有一个原因是使用虚拟析构函数.那就是关闭gcc警告:"class'Base'具有虚函数但非虚析构函数".只要您始终将分配的对象存储在a中shared_ptr
,那么您实际上不需要虚拟析构函数.这是如何做:
#include <iostream> // cout, endl
#include <memory> // shared_ptr
#include <string> // string
struct Base
{
virtual std::string GetName() const = 0;
};
class Concrete : public Base
{
std::string GetName() const
{
return "Concrete";
}
};
int main()
{
std::shared_ptr<Base> b(new Concrete);
std::cout << b->GetName() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
该shared_ptr
会正确地清理,而不需要一个虚析构函数.记住,你将需要使用shared_ptr
,但!
祝好运!