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

c++ - C ++模板鸭子类型与纯虚拟基类继承

在模板鸭子类型和纯虚拟基类继承之间进行选择的准则是什么?例子:

0 投票
3 回答
2906 浏览

c++ - C++ 前向声明和纯虚函数

我在使用前向声明和虚函数时遇到问题。我在编译期间收到以下错误消息。

编译器说这些函数仍然是纯虚函数,但我正确地声明和定义了它们。我不知道问题是什么。

这是我的源代码。

谢谢你。

0 投票
4 回答
6393 浏览

c++ - 抽象类的析构函数应该是纯虚拟的吗?

我认为单独的虚拟通常就足够了。

除了强制派生类实现自己的析构函数之外,还有其他理由让它成为纯虚拟的吗?我的意思是,如果你在你的类的构造函数中分配一些东西,你应该实现你自己的析构函数——不管你的类是否派生。

不算作我已经知道的答案:如果你想要你的类抽象并且它没有纯虚函数 - 把它留给析构函数。

还有一些用途?

0 投票
4 回答
1385 浏览

c++ - C++ - 从抽象基指针调用派生函数

我一直在尝试创建一个基于继承的 TCP 服务器模型,并取得了不同程度的成功。这些服务器由一个单例管理,其任务是关闭这些服务器和其他简单的维护功能:

TCPDaemon 类的 Stop() 函数是纯虚函数。我的问题是,当调用 Shutdown() 函数时,它试图调用这个纯虚拟而不是派生类的版本。我怎样才能强迫它做正确的事?

提前致谢

[编辑] 抱歉,我之前没有包含 TCPDaemon 代码,它派生自 TCPSocket 类(我已经检查过它是 100% 工作的,并且相当不言自明)。这里是:

这是一个示例派生服务器及其创建方法:

[edit+1] 我认为问题归结为这个(我很容易出错):我有一个基类 TCPDaemon 的 std::map,它有一个纯虚拟/抽象函数 Stop()。看来,当我通过映射中的一个条目调用 Stop() 时,它正在尝试调用 TCPDaemon::Stop(),而不是覆盖函数 EchoServer::Stop()。这可能是问题吗?如果是这样,我该如何解决?

0 投票
3 回答
834 浏览

c++ - `= 0` 在纯虚函数的声明中是什么意思?

可能的重复:
C++ 虚拟/纯虚拟解释
c++ 中的虚函数实例化有什么区别
为什么纯虚函数初始化为 0?

这是某人给我的某个类声明中的一种方法。而且我不知道'..=0'是什么意思。它是什么?

0 投票
3 回答
712 浏览

c++ - 一个基类如何使用另一个父类的函数来满足一个父类的纯虚函数的定义

我正在扩展一个现有的 C++ 项目。我有一个派生自两个父类的基类。其中一个父母有一个纯虚函数。我希望该纯虚函数由另一个父级中实现的函数定义。

所以,我希望另一个父类满足基类定义父类纯虚函数的义务。我尝试了两种方法,都导致编译器错误。
有任何想法吗?

这是一个展示我的第一个想法的 C++ 程序,希望编译器只base2使用vfunc().

编译器报告它derived仍然是一个抽象类:

这是我的第二次尝试:

我实际上希望这能为我做这件事,但链接器却给了我一堆我不明白的 vtable 错误:(Mac OS 10.6,gcc 4.2.1)

0 投票
3 回答
1393 浏览

c++ - 在 C++ 中重新定义纯虚方法

您是否必须在基类中声明替换纯虚函数的方法?如果是这样,为什么?由于基类已将方法声明为纯虚拟方法,因此必须存在于派生类中,因此不必在派生类中重新声明它们,然后才能在类定义之外实现它们。你不同意吗?

0 投票
3 回答
4564 浏览

c++ - C++:纯虚赋值运算符

为什么如果我们在基类中有纯虚拟赋值运算符,那么我们在派生类上实现该运算符,它会在基类上给出链接器错误?

目前我在http://support.microsoft.com/kb/130486上只有以下解释,它说这种行为是设计使然,因为正常的继承规则不适用

我不清楚,为什么设计会产生链接器错误?有人可以给我更清楚的解释吗?

编辑:添加了发生错误的简化代码:

如果没有 __declspec(dllexport)和/或没有基类上的纯虚拟运算符 = 声明,代码将无错误地编译。

没有__declspec(dllexport)赋值后*bd1 = *bd2;,d1::memberB 为 1,但__declspec(dllexport)d1::memberB 保持不变

__declspec(dllexport), 和没有纯虚声明,在赋值后*bd1 = *bd2;d1::memberB 保持不变

0 投票
3 回答
7780 浏览

c++ - 如何从 C++ 中的 DLL 导出纯虚函数?

我有一个奇怪的问题,没有纯虚函数从 DLL 导出。DLL 编译并作为 .dll 文件输出到目录。但它不会产生 .lib 文件。

如果我给出定义并且它不再是纯虚拟的,那么它会愉快地创建 .lib 文件。

我需要实现我需要分离接口和实现的工厂模式。我的工厂实现和其他使用想要的 .dll(没有生成 .lib 文件)的接口需要使用该导出函数,当我使用这些函数时,它们会产生链接错误......

如“错误LNK2011:无法解析的外部符号“public:.......”

知道如何导出纯虚函数,以便可以为其他 exe 和 dll 实现它们

问候乌斯曼

0 投票
4 回答
794 浏览

c++ - 接口开销

我有一个看起来像 Boost.Array 的简单类。有两个模板参数 T 和 N。Boost.Array 的一个缺点是,每个使用这种数组的方法都必须是一个带有参数 N 的模板(T 是可以的)。结果是整个程序往往是一个模板。一个想法是创建一个仅依赖于 T(类似于 ArrayInterface)的接口(仅具有纯虚函数的抽象类)。现在每个其他类只访问接口,因此只需要模板参数 T(与 N 相比,它或多或少总是已知的)。如果使用接口,这里的缺点是虚拟调用的开销(更多错失内联调用的机会)。直到这里只有事实。

但我真正的问题在于其他地方。当我使用接口扩展 Boost.Array 时,Boost.Array 的直接实例化会变慢(在一种情况下,因子 4,这很重要)。如果我删除接口,Boost.Array 和以前一样快。我了解,如果通过 ArrayInterface 调用方法存在开销,那没关系。但是我不明白如果只有一个只有纯虚拟方法的附加接口并且直接调用该类,为什么对方法的调用会变慢。

GCC 4.4.3 和 Clang 1.1 表现出相同的行为。