问题标签 [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 投票
6 回答
2114 浏览

c++ - 在什么情况下给出一个纯虚函数的实现是有利的?

在 C++ 中,给出纯虚函数的实现是合法的:

你为什么要这样做?

相关问题:C++ faq lite包含一个示例:

我不明白为什么将析构函数声明为纯虚拟然后实现;我不明白为什么这应该更快的评论。

0 投票
8 回答
40723 浏览

c++ - C++中纯虚函数的用途是什么?

我现在在一堂课上学习 C++,我不太了解纯虚函数。我知道它们稍后在派生类中进行了概述,但是如果您只是要在派生类中定义它,为什么要将其声明为等于 0?

0 投票
11 回答
99741 浏览

c++ - 为什么我们需要 C++ 中的纯虚析构函数?

我理解对虚拟析构函数的需求。但是为什么我们需要一个虚析构函数呢?在其中一篇 C++ 文章中,作者提到当我们想要使类抽象时,我们使用纯虚析构函数。

但是我们可以通过将任何成员函数设为纯虚拟来使类抽象。

所以我的问题是

  1. 我们什么时候才能真正使析构函数成为纯虚拟的?任何人都可以举一个很好的实时例子吗?

  2. 当我们创建抽象类时,使析构函数也成为纯虚拟是一种好习惯吗?如果是的话..那为什么?

0 投票
4 回答
905 浏览

c++ - 实现纯虚拟类的 C++ 实例集合

我在跨平台 C++ 中工作,并且有一些这样定义的类:(对于这个例子进行了高度简化)

最初我只有一个类,我将一堆实例存储在 std::vector 中,并通过 const 引用传递。但是现在我需要一个基类(我想保持纯虚拟)和一些多态实现类。

收集任何实现实例的最佳方法是什么,并且仍然具有无泄漏的简单内存管理,例如分配堆栈 std::vector?

  • 显然我现在不能拥有 std::vector< ExampleBase >,因为 std::vector 要求该类是非纯虚拟的(因为它执行内部分配/复制等)。我不希望我的代码的用户意外地创建 ExampleBase 的实例,因为那是错误的。我还想避开对象切片或任何其他讨厌的任何可能性。

  • 一个数组std::auto_ptr可以完成这项工作,但是我必须处理所有初始化,寻找“空闲槽”,没有迭代器等。重新发明所有这些轮子似乎有点疯狂。

  • boost::ptr_vector看起来很有希望,但是它的行为有点奇怪,因为在 Linux 上构建时,它需要 ExampleBase 是非纯虚拟的 - 我不明白为什么......所以boost::ptr_vector出来了。

这似乎很简单,而且可能很常见。那么最好的方法是什么?我对任何其他标准或增强方式持开放态度:以“最好”为准。

0 投票
5 回答
48182 浏览

c++ - 未定义的符号“vtable for ...”和“typeinfo for ...”?

几乎是最后一步,但仍有一些奇怪的错误....

vtable和typeinfo是什么意思?

0 投票
3 回答
7003 浏览

c++ - 纯虚方法调用

我理解为什么从构造函数调用虚函数不好,但我不确定为什么定义析构函数会导致“调用纯虚方法”异常。该代码使用 const 值来减少动态分配的使用——可能也是罪魁祸首。

0 投票
10 回答
97046 浏览

c++ - 带有实现的纯虚函数

我的基本理解是没有纯虚函数的实现,但是,有人告诉我可能有纯虚函数的实现。

上面的代码可以吗?

使其成为具有实现的纯虚函数的目的是什么?

0 投票
11 回答
55264 浏览

c++ - 为什么纯虚函数初始化为0?

我们总是将纯虚函数声明为:

即,它始终分配为 0。

我的理解是,这是将此函数的 vtable 条目初始化为 NULL,此处的任何其他值都会导致编译时错误。这种理解正确与否?

0 投票
7 回答
38784 浏览

c++ - 纯虚方法调用

编辑:已解决

我现在正在做一个多线程项目,我有一个基础工作类,其中有不同的工作类继承自它。在运行时,工作类成为线程,然后根据需要执行工作。

现在,我已经编写了一个 Director,它应该维护一个指向所有工作人员的指针数组,以便它可以从中检索信息,以及稍后修改其中的变量。

我通过创建一个指向基类指针的指针来做到这一点:

然后在 Director 的构造函数中,我动态分配一个指向基工作类的指针数组:

在每个worker线程的构造函数中,worker调用director中的一个函数,该函数旨在将该worker的指针存储在数组中。

以下是 director 存储指针的方式:

这是一个工人变体的例子。每个worker都继承自基础worker类,基础worker类包含应该存在于所有worker变体中的纯虚函数,以及一些在所有worker之间共享的变量。

然后 baseWorkerClass 看起来像这样:

在每个 worker 变体完成初始化后,我应该得到一个指向 baseWorkerClass 对象的指针数组。这意味着我应该能够,例如,使用某个工作人员的 ID 作为数组的索引来获取给定变量的值,如下所示:

问题是这段代码导致 Windows 可执行文件崩溃,没有任何解释原因,在 Linux 中,它说:

纯虚方法调用
terminate 调用时没有活动异常
Aborted

我本可以发誓我在某个时候可以做到这一点,所以我对自己搞砸了什么感到困惑。


有问题的实际未修改代码:

Worker 变体头文件:http: //pastebin.com/f4bb055c8
Worker 变体源文件: http: //pastebin.com/f25c9e9e3

基础工作者类头文件:http: //pastebin.com/f2effac5
基础工作者类源文件: http: //pastebin.com/f3506095b

Director 头文件:http: //pastebin.com/f6ab1767a
Director 源文件: http: //pastebin.com/f5f460aae


编辑:额外信息,在 manageWorker 函数中,我可以从指针“worker”调用任何纯虚函数,它工作得很好。在 manageWorker 函数之外,当我尝试使用指针数组时,它会失败。

编辑:现在我考虑一下,线程的入口点是 operator()。Director线程是在worker之前创建的,这可能意味着重载的括号运算符在被子类覆盖之前正在调用纯虚函数。我正在调查这个。

0 投票
3 回答
3950 浏览

c++ - 从抽象类派生类 (C++)

我有一个带有纯虚函数 f() 的抽象类,我想创建一个从该类继承的类,并覆盖函数 f()。我分离了头文件和cpp文件。我在头文件中声明了函数 f(int),定义在 cpp 文件中。但是,编译器说派生类仍然是抽象的。我该如何解决?