问题标签 [pure-virtual]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
10983 浏览

c++ - 根据定义,将“虚拟析构函数放入接口”是否不再使其不再是接口?

所以这就是我所在的盒子。我想了解为什么在你的接口类中有一个“虚拟析构函数”很重要。如果你能坚持到最后,你就会明白为什么这些东西是用引号引起来的……我也想让所有的词汇都绝对正确。到目前为止,这是我在这个过程中所处的位置:

  1. 有时你有基类,有时你有从基类继承的派生类。

  2. 如果您有一个发现自己指向派生对象的基指针,并且您希望从该基指针指向派生对象的成员函数调用表现得好像它实际上已被调用从派生对象,那么你调用的成员函数最好在基类中声明为virtual。

  3. 接口是任何只有纯虚函数的类。如果从这个接口类派生出一个新的类,并且实现了所有的纯虚函数,那么最终就可以创建派生类的实例了。

  4. 你永远不可能有一个接口类的实例,但是你可以有一个指向接口类的实例。

  5. 如果你有一个指向接口类的指针,它实际上指向派生类的一个对象(实际上,我想如果#4 是正确的,它总是必须如此),并且如果你决定通过删除该对象您的指针,那么如果您没有“接口类中的虚拟析构函数”,那么您销毁派生对象的意图将仅作为销毁基对象(即接口类)的调用执行,因为没有虚拟析构函数,事情永远不会到达实际调用派生对象的析构函数的地步——从而导致内存泄漏。

呸。好的,如果这听起来不错,请回答我的问题。像这样在你的界面中声明一个虚拟析构函数就足够了:

这在我看来是错误的......所以如果你让析构函数像这样纯虚拟会发生什么:

由于它们只是声明,因此其中任何一个都算作“接口类中的虚拟析构函数”吗?你甚至可以有一个已声明但未定义的析构函数吗?只有当它是纯虚拟的我猜...

无论如何,所以回到标题问题......我真的尽可能快......这是钱......如果你的“你的接口类中的虚拟析构函数”至少需要一个像这样的空定义:

那么该成员函数不是纯虚函数(不可能是因为您给了它一个定义),因此您的类不再是接口(它不仅包含纯虚成员函数)。

这意味着如果你为你的接口定义了一个虚拟析构函数,那么你就不再有一个接口(而只是一些抽象基类)。这只是语言的滥用吗?我明白发生了什么吗?

注意:所有这一切都来自于问自己“什么是接口?” 然后阅读这个问题的答案: How do you declare an interface in C++?

希望步行时间不会太长,但我决心完全理解这些概念及其相关词汇。

0 投票
6 回答
362 浏览

c++ - 具有纯虚方法的抽象类 - 为什么可以执行“Abstract * abs3;”?

考虑以下 :

请注意我没有实现func(),那么为什么可以Abstract * abs3; 在我们有纯虚方法和抽象类的地方做呢?我知道如果我尝试执行 abs3->func(); 会出现运行时错误;,但是,我仍然不清楚为什么 C++ 允许编译该代码......?

谢谢,罗恩

0 投票
2 回答
113938 浏览

c++ - “无法分配抽象类型的对象”错误

错误在这里:

祖父母班:

父类:

实际/子类:

我知道这是一个很长的镜头,我不能在这里写完整的代码......</p>

0 投票
4 回答
600 浏览

c++ - C++,钻石继承,何时/何时需要实现纯虚拟?

C++:我有一个带有纯虚函数 f() 的基类 A,然后两个类 B 和 C 虚拟继承自 A,以及一个继承自 B 和 C 的类 D(典型的菱形结构):

在以下情况下,何时何地需要实现 f() = 0?

  1. B 和 C 也都有纯虚函数(-> 抽象类必须实现继承的纯虚函数吗?)
  2. 其中只有一个(B XOR C)具有纯虚函数(-> 另一个还必须实现 f() 吗?)
  3. B 和 C 都没有自己的纯虚拟(-> 跳过 B 和 C 中的实现并将其“传递”给 D 的可能方法?)
  4. 在上述三种情况下,D需要实现f()吗?在哪些情况下 D 可以选择实现 f()?在哪些情况下,如果有的话,D 不可能实现 f()?

对于这类问题,还有其他常见的建议吗?

谢谢。

0 投票
6 回答
714 浏览

c++ - 如果一个类有一个非纯析构函数,它还能是纯抽象的吗?

我正在做一个练习,要求我学习一个基类 Rodent 并使其成为一个纯抽象类。我对纯抽象类的理解是它充当接口,只包含纯虚函数。虽然这是一个简单的练习,但我对本书提供的解决方案有疑问:

如您所见,作者为析构函数添加了一个虚拟定义。添加这个定义是否意味着这是一个抽象类而不是一个“纯”抽象类?

0 投票
4 回答
4642 浏览

php - PHP中是否有像C++那样的纯虚函数

我原以为很多人会想知道这是否可能,但我找不到任何重复的问题......请纠正我。

我只想知道PHP是否提供纯虚函数。我想要以下

非常感谢。

0 投票
6 回答
264 浏览

c++ - 如何从基类函数调用重写的虚函数?

我刚刚意识到我将代码简化得太多了,它并没有反映我真正的问题。我很抱歉没有更具体。我实际上尝试做的是以下内容:

在线演示

我猜程序调用了纯虚函数A::f,因为B在调用构造函数时尚未创建。

这是正确的,我该如何克服这个问题?

请原谅我之前给出了过于简单的问题。

0 投票
4 回答
6181 浏览

c++ - 在基类本身中定义“纯”虚函数是否有意义?

在基类中定义通用虚函数的好处是我们不必在派生类中重新定义它们。

即使我们在基类本身中定义了虚函数,我们仍然必须在派生类中定义它们。

这可能看起来很花哨,但是在任何情况下在基类本身中定义纯虚函数 是有益的吗?

0 投票
5 回答
491 浏览

c++ - 用其他基类的方法满足纯抽象方法的最简单方法是什么

编辑:根据一些评论,简单的意思是a)代码更少,b)易于维护,c)很难出错。

编辑#2:此外,如果确实简化了InterfaceImpl.

目前,我知道的唯一方法是让实现者定义抽象方法并将调用委托给目标基类型的方法。例子:

起初,我认为这也许可以解决问题:

第一个 using 语句将使这两个MethodOneImpl::method1方法都公开,但它实际上不履行与 的约定Interface,并且它修改了 的可访问性MethodOneImpl::method1(int)。显然我们不能使用这个解决方案,method2因为名称不匹配。

FWIW,我有我认为的解决方案,但它根本不是标准的一部分(换句话说,它不会编译)。我正在考虑向 C++ 委员会提出建议;如果有人有任何建议,我将不胜感激下面的任何评论(但请不要将建议作为答案提交)。

0 投票
5 回答
4852 浏览

c++ - 类内的纯虚拟析构函数定义给出编译错误

in基pure virtual destructor类应该有一个定义。否则编译器将在链接时从派生类析构函数生成对基类析构函数的调用,并导致链接错误。

我试图在基类中定义纯虚拟析构函数,如下所示:

这给出了编译错误:

错误:函数定义上的纯说明符

然后我尝试在基类之外定义函数,如下所示:

这消除了编译错误,它的行为符合我的理解。

但我的问题是在基类之外定义纯虚析构函数如何消除编译错误?