草庐IT

pure-virtual

全部标签

c++ - 海湾合作委员会 : C++11 inline object initialization (using "this") does not work when there is a virtual inheritance in hierarchy

当在初始化中使用此指针并且在层次结构中存在虚拟继承时,C++11内联对象初始化不起作用(在GCC中)。这可能是GCC的错误吗(因为它在CLang中工作)?还是C++11标准本身的差距?示例(可以在here中尝试),当使用GCC编译以下代码时:FieldIndexm_inB{"inB",this};不会被执行。但它会在使用CLang编译时执行。变通方法:从FieldIndexContainer派生A作为虚拟#include#include#includeusingnamespacestd;classFieldIndexContainer{public:classFieldIndex{pu

c++ - 使用 protected 非虚拟析构函数时抑制 delete-non-virtual-dtor 警告

我有一个纯抽象接口(interface)类和一个实现该接口(interface)的派生类。structFoo{virtualvoiddoStuff()=0;};structBar:Foo{voiddoStuff()override{}};我的接口(interface)类没有虚拟析构函数。因此,尝试使用基类指针破坏派生实例显然是未定义的行为intmain(){Foo*f=newBar;f->doStuff();deletef;}幸运的是我的编译器足够聪明,可以捕捉到这个(使用-Werror)main.cc:15:9:error:deletingobjectofabstractclasst

c++ - 如何解决 : undefined reference to `non-virtual thunk to ...`

我正在尝试弄清楚如何进一步解决此问题。我还想知道如何安装更新版本的ld(如果有意义的话)。所有涉及的包管理器都告诉我,我是最新的。代码在ubuntu12.04和12.10上使用g++(4.7.2)编译、链接和运行,但在FC17上编译失败并出现此错误。ArchiveServiceLib/debug-posix/libArchiveLib.a(NamedIflTiffCache.o):(.rodata._ZTV26UnlockingGenericFileHandle[_ZTV26UnlockingGenericFileHandle]+0x58):undefinedreferenceto`I

c++ - C++ 中 [[pure]] 的澄清

阅读标准C++属性的最新提案[[pure]]我留下了一些问题:[[pure]]函数可以读取常量全局变量吗?[[pure]]函数可以读取静态常量变量吗?[[pure]]函数是否可以写入但不读取指针或引用变量(并且仍可能返回void)? 最佳答案 [[pure]],如果我没记错的话,需要100%确定特定输入应始终返回特定输出。考虑到constglobals和staticconstglobals不应该改变状态,应该没问题。最后,读取一个可以改变状态的指针将不是一个纯函数。如果您写入在别处访问的指针,那么它会产生副作用并且不是[[pure]

C++ : noexcept (or throw()) virtual destructor = default;

下面的代码是合法的吗?classC{virtual~C()noexcept=default;};或classC{virtual~C()throw()=default;};(throw()已弃用,但我的编译器不支持noexcept;;) 最佳答案 8.4.2[dcl.fct.def.default]Anexplicitly-defaultedfunction[...]mayhaveanexplicitexception-specificationonlyifitiscompatible(15.4)withtheexception-spe

c++ - 接口(interface)开销

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

c++ - 是否可以编写这些 pure_assert 和 const_assert 宏?

GCC__attribute__((pure))和__attribute__((const))分别允许将函数声明为无副作用和引用透明;假设我想编写pure_assert和const_assert宏,其参数必须是适当严格级别的表达式,即:assert(oops_a_side_effect());静默导致调试和发布中的不同行为,但是:pure_assert(oops_a_side_effect());const_assert(oops_read_a_global());至少在调试版本中会出现编译时错误。由于我希望是显而易见的原因,您不能只创建一个声明为__attribute__((pure

c++ - 为什么 MSVS 允许 NULL 作为纯虚函数说明符?

考虑以下程序:structTest{virtualvoidfoo()=NULL;};intmain(){}g++4.8.1给出如下预期错误:[Error]invalidpurespecifier(only'=0'isallowed)before';'tokenClang给出以下错误:error:initializeronfunctiondoesnotlooklikeapure-specifier但是当我在MSVS2010上尝试它时,它编译并运行良好。我认为g++&clang在这种情况下是正确的。标准对此有何规定?我也使用\Za命令行选项禁用了编译器扩展,但MSVS仍然接受该代码。为什么

c++ - 纯虚拟 friend 类

我有课A有一个指向纯虚类实例的指针B.类C源自B并且会自动有一个指向A的指针(它是它的父级),并且需要访问它的成员。这可以通过添加friendclassC来实现内部类A,虽然这对于将从B派生的每个类都是必需的.代码示例:classA{public:friendclassB;//ThisdoesnotallowderivedclassestobefriendsfriendclassC;//NowderivedclassBhasaccessto`DoDomething`,butthenthisisneededforeverysinglederivedclassprivate:voidDoD

c++ - 通常方法上的 Woverloaded-virtual 警告

我很困惑为什么下面的代码会产生Woverloaded-virtual警告。classTestVirtual{public:TestVirtual();virtualvoidTestMethod(inti);};classDerivedTestVirtual:publicTestVirtual{public:voidTestMethod();};派生类具有不带参数的常用方法TestMethod-签名不同于基类的类似虚拟方法。那为什么编译器不能解决这种情况呢? 最佳答案 警告的原因是无参数版本从基类中隐藏了int版本。DerivedTe