【发布时间】:2011-10-21 11:20:26
【问题描述】:
这就是我所在的盒子。我想了解为什么在你的接口类中有一个“虚拟析构函数”很重要。如果你能坚持到最后,你就会明白为什么这些东西是用引号引起来的……我也想让所有的词汇都绝对正确。到目前为止,我的流程如下:
有时你有基类,有时你有从基类继承的派生类。
如果您有一个发现自己指向派生对象的基指针,并且您希望从该基指针指向派生对象进行的成员函数调用表现为如果它实际上是从派生对象调用的,那么你调用的成员函数最好在基类中声明为 virtual。
接口是具有仅纯虚函数的任何类。如果从这个接口类派生出一个新类,并实现了所有的纯虚函数,那么最终就可以创建派生类的实例了。
你永远不能有一个接口类的实例,但是你可以有一个指向接口类的实例。
如果你有一个指向接口类的指针,它实际上指向派生类的一个对象(实际上,我想如果#4 是正确的,它总是必须如此),如果你决定通过您的指针删除该对象,那么如果您没有“接口类中的虚拟析构函数”,那么您销毁派生对象的意图将仅作为销毁基对象(即接口类)的调用执行) 并且由于没有虚拟析构函数,因此事情永远不会到达实际调用派生对象的析构函数的地步——从而导致内存泄漏。
呸。好的,如果这听起来不错,请回答我的问题。像这样在界面中声明一个虚拟析构函数就足够了吗:
virtual ~iFace();
这对我来说看起来不对......所以如果你像这样将析构函数设为纯虚拟会发生什么:
virtual ~iFace() = 0;
既然它们只是声明,那么它们中的任何一个都算作“接口类中的虚拟析构函数”吗?你甚至可以有一个已声明但未定义的析构函数吗?只有当它是纯虚拟的我才会猜......
无论如何,所以回到标题问题...我真的要尽可能快...这是钱...如果您的“接口类中的虚拟析构函数”至少需要一个空定义如下:
virtual ~iFace() {};
那么该成员函数不是纯虚函数(不可能是因为您给了它一个定义),因此您的类不再是接口(它不仅包含纯虚成员函数) .
这意味着如果你为你的接口定义了一个虚拟析构函数,那么你就不再有一个接口(而只是一些抽象基类)。这只是语言的滥用吗?我明白发生了什么吗?
注意:所有这些都来自于问自己“什么是接口?”然后阅读这个问题的答案:How do you declare an interface in C++?
希望步行时间不会太长,但我决心完全理解这些概念及其相关词汇。
【问题讨论】:
-
接口的概念对于激发语言扩展来说非常重要。查看此页面:msdn.microsoft.com/en-us/library/4bt10hsa%28VS.80%29.aspx
-
哇,好多好答案!
-
C++ 中的接口只是概念。仅仅因为你有一些函数的实现,它并不能阻止它成为一个接口(它只是在数学意义上不是纯粹的)。现实世界是一个肮脏肮脏的地方,并非所有事物都能完美地融入数学概念。只是顺其自然。 PS。所有的类也都有一些与之相关的编译器定义的方法,所以没有一个是纯粹的。聚苯乙烯。我讨厌 Java 对纯接口的强制执行(有时它会使代码更简单地定义辅助方法)。
-
“实际上,只有纯虚函数的类通常称为接口。” -- Bjarne S. ...我想我错过了“经常”这个词...该死! www2.research.att.com/~bs/bs_faq2.html
-
我是 .net 人而不是 C++ 人,但我认为定义接口的概念不是它只有纯虚函数,而是它没有成员字段。如果一个类有一个纯虚拟方法 SetBounds(int left, int top, int width, int height, int args_specified) 和非虚拟包装方法,如 SetWidth(int width) 可以适当地调用它,我不认为非-virtual 方法将使其不是“接口”。我知道 .net 接口需要扩展方法,但我认为这是平台限制。
标签: c++ interface terminology pure-virtual