草庐IT

继承权

全部标签

c++ - 检查 C++ 类是否公开继承自带有匿名参数的模板类

类似于thisquestion,我如何测试一个类Impl公开继承自模板类BaseTempl(即classImpl:publicBaseTempl{...};),而不指定模板参数?但是,与上述问题不同的是,如果继承不是公开的,我希望测试仍然可以编译(并返回false)。理想情况下,代码允许我做这样的事情:classalpha:publicBaseTempl{};classbravo:BaseTempl{};classcharlie{};classdelta:publicBaseTempl,publiccharlie{};classecho:publicdelta{};intmain(){

c++ - 类模板继承在 GCC 中编译失败,但在 Visual Studio 中有效

有人能告诉我为什么以下代码在VisualStudio2010中完美运行,但在gcc5.3中无法编译,尽管它看起来没有任何问题?我已经进行了一些谷歌搜索,但没有找到描述模板类继承的清晰标准方法。#include#includenamespacefoobar{templateclassbasic_foo{public:inlinebasic_foo(){}virtual~basic_foo(){}typedefstd::basic_stringstr_foo;enum{fooEnum=100};};templateclassbasic_bar:privatebasic_foo{public

c++ - 警告 C++11 继承的构造函数

https://en.wikipedia.org/wiki/C++11#Object_construction_improvementForbase-classconstructors,C++11allowsaclasstospecifythatbaseclassconstructorswillbeinherited.Thus,theC++11compilerwillgeneratecodetoperformtheinheritanceandtheforwardingofthederivedclasstothebaseclass.Thisisanall-or-nothingfeatur

c++ - 通过使用范围解析避免多重继承引起的歧义

这是一个多重继承的例子。我使用范围解析运算符而不是虚拟类来解决歧义。structA{inti;};structB:A{};structC:A{};structD:B,C{voidf(){B::i=10;}voidg(){std::coutB::i是否合式? 最佳答案 IsB::iwell-formed?是的,是的。最相关的引用是[class.qual]/1:Ifthenested-name-specifierofaqualified-idnominatesaclass,thenamespecifiedafterthenested-n

C++ 多重继承和向上转换的智能指针销毁导致 VS 2017 中的堆损坏

我在使用上面的代码时遇到了VS调试器的问题:classAnimal{public:};classStupid{public:};classDog:publicStupid,publicAnimal{public:};intmain(){std::unique_ptranimal=std::unique_ptr(newDog());animal.reset();return0;}此代码在执行涉及“ntdl.dll”和“wntdll.pdb”的“animal.reset()”后抛出错误。如果我点击“忽略”多次(3)次,以下是MSVC运行时库生成断言失败的表达式:1-_CrtIsValidH

c++ - 为什么继承的 protected operator=() 具有公共(public)访问权限

声明为protected的重载运算符=对于继承父类作为public的子类是公开可访问的。#includeclassA{public:A(charc):i(c){}chari;protected:A&operator=(constA&rdm){std::cout编译时没有错误:$g++-Wall-otest_operator~/test_operator.cpp$./test_operatora.i==aaccessingoperator=()a.i==x直接使用A是编译不过的。operator=()以外的任何其他运算符重载都不会编译。使用g++4.4.7和7.3.0以及c++98和c+

c++ - 继承引用无法正常工作

当运行下面的代码时,它涉及通过一个名为B的类的方法更改int的值,该类继承自模板类A,int的值没有改变,我不明白为什么,我已经用clangtrunk和gcctrunk测试了这两个:#includetemplatestructA{A(T&a_num_):a_num(a_num_){}T&a_num;};structB:publicA{templateB(Args...args):A(args...){}voiddo_something(){a_num=1634;}};intmain(void){intnum=4;Bb{num};b.do_something();std::cout我希望

C++继承问题

这是我的类(class):ParentClass,ParentObjDerivedClass(inheritsfromParentClass),DerivedObj(inheritsfromParentObj).ParentClass有一个protected成员:std::vectorDerivedClass仅将DerivedObj*对象分配给此vector。问题是:当我使用ParentClass时,我想使用以下类型的迭代器访问其vector对象:std::vector::const_iterator当我使用DerivedClass时,我想使用以下类型的迭代器访问其vector对象:s

c++ - 具有多级继承的大型 C++ 项目的文件/文件夹布局

我正处于一个相对较大(10k+行)项目的规划阶段,该项目具有多个类(30+)和多个级别的类继承(5+)。根据文件和文件夹结构布置我的项目的最佳(或最常规)方式是什么?每个类(class)应该有一个文件吗?每个继承分支应该有一个文件夹吗?我应该有一个包含我的头文件的“include”文件夹,还是我的头文件应该与我的.cpp/.c文件位于同一个文件夹中?我计划定期添加更多类(向继承树添加更多级别)。在树的最低层,实现可能是相对不相关的,但仍然覆盖相同的虚函数。这些不相关的实现是否应该放在同一个文件夹中?谢谢,告诫 最佳答案 1)是的。在

c++ - 混合模板函数重载和继承

打印以下代码:genericoverload但我想要的是在两种情况下都调用了重载或特化,而不是通用的。我并没有试图将重载与模板特化混合在一起,它们在这里是因为没有一个像我预期的那样工作。是否有任何模板魔术可以实现这一目标?#includeclassInterface{};classImpl:publicInterface{};classBar{public:templatevoidfoo(T&t){std::coutvoidBar::foo(Interface&t){std::cout 最佳答案 使用type_traits测试参数是