当虚拟析构函数被声明但没有实现时会发生什么?
What happens when virtual destructors are declared, but have no implementation?
在 C++ 中,我们可以完美地在头文件中声明一个函数,而无需实际实现它。这编译得很好,通常这不会提供任何问题,但是......我想知道当未实现虚拟析构函数时它是否会导致问题。
当未实现虚拟析构函数时,在这种情况下,当我们通过基class的指针删除派生class的实例时,派生[=20]的析构函数=] 还叫吗?
例如
class Base{
public:
virtual ~Base() {}
};
class Derived: public Base {
public:
~Derived(); // HAS NO IMPLEMENTATION
};
Base *b = new Derived();
delete b;
注意:正如评论中指出的那样,上述示例并不 LINK 正确。此处提供它是为了解释我试图获得更多见解的情况,但实际上在链接过程中,此示例将导致 undefined reference to Derived
错误。
如果您曾经调用 ~Derived()
(例如通过删除 b
),您将收到链接错误,因为析构函数的符号不存在。由于 ~Base()
是虚拟的,当您删除 b
时,~Derived()
仍将(尝试)被调用。没有实施与此无关。
What happens when virtual destructors are declared, but have no implementation?
如果曾经调用过析构函数(例如在您的示例中),则程序违反了一个定义规则,因此是 ill-formed。标准不需要诊断,编译器将无法判断有什么问题。但幸运的是,您可能会因链接器错误而得救。
In C++ we can perfectly declare a function in a header file without actually implementing it.
这是真的。但是我们不能调用这样的函数。
virtual 和 destructor 与问题关系不大。这些规则适用于所有函数。
在 C++ 中,我们可以完美地在头文件中声明一个函数,而无需实际实现它。这编译得很好,通常这不会提供任何问题,但是......我想知道当未实现虚拟析构函数时它是否会导致问题。
当未实现虚拟析构函数时,在这种情况下,当我们通过基class的指针删除派生class的实例时,派生[=20]的析构函数=] 还叫吗?
例如
class Base{
public:
virtual ~Base() {}
};
class Derived: public Base {
public:
~Derived(); // HAS NO IMPLEMENTATION
};
Base *b = new Derived();
delete b;
注意:正如评论中指出的那样,上述示例并不 LINK 正确。此处提供它是为了解释我试图获得更多见解的情况,但实际上在链接过程中,此示例将导致 undefined reference to Derived
错误。
如果您曾经调用 ~Derived()
(例如通过删除 b
),您将收到链接错误,因为析构函数的符号不存在。由于 ~Base()
是虚拟的,当您删除 b
时,~Derived()
仍将(尝试)被调用。没有实施与此无关。
What happens when virtual destructors are declared, but have no implementation?
如果曾经调用过析构函数(例如在您的示例中),则程序违反了一个定义规则,因此是 ill-formed。标准不需要诊断,编译器将无法判断有什么问题。但幸运的是,您可能会因链接器错误而得救。
In C++ we can perfectly declare a function in a header file without actually implementing it.
这是真的。但是我们不能调用这样的函数。
virtual 和 destructor 与问题关系不大。这些规则适用于所有函数。