问题标签 [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 回答
185 浏览

c++ - 子类化模板类而不实现纯虚方法

我有以下类定义:

我创建了以下子类:

这在 VS2005 下编译得很好,但我还没有constructItem()MyQueue课堂上实现。知道为什么吗?

0 投票
4 回答
399663 浏览

c++ - 虚函数和纯虚函数的区别

纯虚函数和虚函数有什么区别?

我知道“纯虚函数是一个没有实体的虚函数”,但这意味着什么以及下面的行实际上是做什么的:

0 投票
1 回答
1275 浏览

c++ - 共享库中的抽象类

我有一个普通的抽象类,它有几个纯虚方法。类本身是共享库的一部分。共享库本身的编译是可以的。但是,当该库链接到另一个程序时,该程序具有从共享库中的抽象类派生的另一个类并定义纯虚拟方法,我收到以下链接器错误。

我这样编译..:

链接器错误是:

libsomename.so:未定义对“AbstractClass::method()”的引用

就像抽象类无法访问其纯虚拟方法一样,但我不会尝试在库中的任何位置创建抽象类的任何实例。

可能是什么问题呢?

0 投票
1 回答
239 浏览

c++ - 标准中的哪里转发到这些情况下所需的基类?

也许更好的是:为什么标准在这些情况下需要转发到基类?(是的,是的 - 为什么? - 因为。)

女士给出:

对于 MS 编译器也是如此。

可能会买第一个箱子,D。但是在 D2 - f 是由 using 声明明确定义的,为什么编译器需要填写 vtable 还不够?

这种情况在标准中的什么地方定义?

添加以响应答案

关于我已接受的以下答案:

为什么这在规范中似乎不是错误?- 如果一个具有一系列非虚拟 f() 的继承层次结构,其在派生类中的使用由 using 语句确定,并且将基类中 f 的 decl 更改为虚拟,则可以更改哪个f 在派生类中调用 using 语句来选择它们的 f。这是一个我不知道的 c++“陷阱”。它可能是语言的一部分,但这种“远距离行动”让我感到不安,对我来说似乎违反了某种正确性/维护原则(我现在无法完全制定)。

但我可以举个例子:

输出:

所改变的只是 C0 中 f 的虚性。特别是一旦选择了基类中 f 的非虚拟性,如果某个派生类(通常人们知道)已经像上面的示例一样“被覆盖”,则无法在没有维护问题的情况下对其进行更改。

如果您反驳“好吧,不要在 NonVirtual 案例中以这种方式覆盖”,我同意这是不好的做法,但这似乎不仅如此。对我来说,语言应该:

不允许在 NonVirtual::D3 中使用(目前不可能,因为可能有其他重载的 f 要引入 [除非在函数情况下使用允许签名])

或者

完全禁止使用函数语句并强制转发

或者

在所有情况下都使用实际覆盖

或者

允许对函数(本质上是使用函数)进行一些语法声明,例如:

究竟,我在这里错过了什么?有人能想出一个场景来阐明标准中这种选择的“原因”吗?

0 投票
6 回答
18228 浏览

c++ - 函数定义上的纯说明符

在 GCC 上编译时出现错误:pure-specifier on function-definition,但当我使用 VS2005 编译相同的代码时却没有。

但是当这个纯虚函数的定义不是内联的时候,它就起作用了:

错误是什么意思?为什么我不能内联?如第二个代码示例所示,逃避编译问题是否合法?

0 投票
2 回答
1619 浏览

c++ - 将私有部分保留在 C++ 头文件之外:纯虚拟基类 vs pimpl

我最近从 Java 和 Ruby 切换回 C++,令我惊讶的是,当我更改私有方法的方法签名时,我必须重新编译使用公共接口的文件,因为私有部分也在 .h 文件中。

我很快想出了一个解决方案,我猜这是 Java 程序员的典型解决方案:接口(= 纯虚拟基类)。例如:

香蕉树.h:

香蕉树.cpp:

这里唯一的麻烦是我不能使用new,而必须调用BananaTree::create(). 我不认为这真的是一个问题,特别是因为我预计无论如何都会大量使用工厂。

然而,现在,C++ 成名的智者提出了另一种解决方案,即pImpl idiom。这样,如果我理解正确,我的代码将如下所示:

香蕉树.h:

香蕉树.cpp:

这意味着我必须为 的每个公共方法实现装饰器风格的转发方法BananaTree,在这种情况下getBanana。这听起来像是增加了我不想要求的复杂性和维护工作。

那么,现在的问题是:纯虚拟类方法有什么问题?为什么 pImpl 方法的文档记录得这么好?我错过了什么吗?

0 投票
2 回答
3091 浏览

c++ - 实现 boost::thread 包装器接口时“调用纯虚拟方法”

我有一个小包装器,它集中了与线程相关的内容:

当我实现它时,请说以下内容:

在 :

我得到了一个运行时终止,显示了一个漂亮的“纯虚拟方法调用”。我认为这是 boost::bind 参数,但我不知道怎么说“使用虚拟纯实现”......

预先感谢。

问候,

神秘先生

0 投票
2 回答
1441 浏览

c++ - 纯虚函数和抽象类

我有以下类,Base 和 Derived,当我编译编译器时抱怨它无法创建 DLog 的实例,因为它是抽象的。

有人能告诉我如何解决这个错误吗?

我猜这是因为并非两个纯虚函数都没有在派生中实现。

// DLog 实例化为单例

0 投票
1 回答
1336 浏览

c++ - c++纯虚类的前向声明

我有一个前进减速问题。我之前有一个普通的类,叫做GlobalCWND,它被实例化并在另一个类中使用ProtocolContext

我转发在Requestor.h.

你可以看到这2个类的代码的相关部分。

============协议上下文========

=================Requestor.h=========

它以前工作正常。现在我已将其更改GlobalCWND为虚拟类,并且在协议上下文构造函数中我有以下代码:

但现在我得到这个错误:

错误行是:

Ptr 类实际上是在创建指向对象的指针,ptr.h 的第 441 行是该函数的最后一行:

开始的代码是GlobalCWND这样的:

0 投票
1 回答
356 浏览

c++ - 从基类“导入”函数定义以实现抽象接口(C++ 中的多重继承)

假设我们有一个继承自两个基类的类(多重继承)。Baseclass A是抽象的,声明了一个纯虚函数foo,另一个 baseclass B声明并实现了foo相同签名的函数。

我想在派生中使用foofrom base的实现。但是,如果我没有在派生中第二次实现该函数,我将无法实例化它的任何对象(它仍然是抽象的)。虚拟继承在这里没有预期的帮助(并且没有公共基类)。class Bclass Cfooclass Cclass Aclass B

我想知道是否有一种方法可以“导入” foofrom class Binto的实现,class C以便不必重复相同的代码。

上面的例子当然是人为的。我想实现的原因foo是我class B想派生class D : public B和使用class B. foo我知道继承不是(主要)用于代码重用,但我仍然想以这种方式使用它。