所以这就是我所在的盒子。我想了解为什么在你的接口类中有一个“虚拟析构函数”很重要。如果你能坚持到最后,你就会明白为什么这些东西是用引号引起来的……我也想让所有的词汇都绝对正确。到目前为止,这是我在这个过程中所处的位置:
有时你有基类,有时你有从基类继承的派生类。
如果您有一个发现自己指向派生对象的基指针,并且您希望从该基指针指向派生对象的成员函数调用表现得好像它实际上已被调用从派生对象,那么你调用的成员函数最好在基类中声明为virtual。
接口是任何只有纯虚函数的类。如果从这个接口类派生出一个新的类,并且实现了所有的纯虚函数,那么最终就可以创建派生类的实例了。
你永远不可能有一个接口类的实例,但是你可以有一个指向接口类的实例。
如果你有一个指向接口类的指针,它实际上指向派生类的一个对象(实际上,我想如果#4 是正确的,它总是必须如此),并且如果你决定通过删除该对象您的指针,那么如果您没有“接口类中的虚拟析构函数”,那么您销毁派生对象的意图将仅作为销毁基对象(即接口类)的调用执行,因为没有虚拟析构函数,事情永远不会到达实际调用派生对象的析构函数的地步——从而导致内存泄漏。
呸。好的,如果这听起来不错,请回答我的问题。像这样在你的界面中声明一个虚拟析构函数就足够了:
virtual ~iFace();
这在我看来是错误的......所以如果你让析构函数像这样纯虚拟会发生什么:
virtual ~iFace() = 0;
由于它们只是声明,因此其中任何一个都算作“接口类中的虚拟析构函数”吗?你甚至可以有一个已声明但未定义的析构函数吗?只有当它是纯虚拟的我猜...
无论如何,所以回到标题问题......我真的尽可能快......这是钱......如果你的“你的接口类中的虚拟析构函数”至少需要一个像这样的空定义:
virtual ~iFace() {};
那么该成员函数不是纯虚函数(不可能是因为您给了它一个定义),因此您的类不再是接口(它不仅包含纯虚成员函数)。
这意味着如果你为你的接口定义了一个虚拟析构函数,那么你就不再有一个接口(而只是一些抽象基类)。这只是语言的滥用吗?我明白发生了什么吗?
注意:所有这一切都来自于问自己“什么是接口?” 然后阅读这个问题的答案: How do you declare an interface in C++?
希望步行时间不会太长,但我决心完全理解这些概念及其相关词汇。