草庐IT

Inheritance

全部标签

java - 为什么需要模板/泛型?传承还不够吗?

我听到很多人说C++模板非常强大。我似乎仍然不明白使用它们而不是使用继承的优势。因为我主要是一名Java开发人员,所以我认为泛型和模板是一回事,但根据Wikipedia:AlthoughC++templates,Javagenerics,and.NETgenericsareoftenconsideredsimilar,genericsonlymimicthebasicbehaviorofC++templates.我还想知道在可能只使用类的地方使用模板是否不会混淆代码? 最佳答案 模板和继承的作用不同,比较少见您可以在其中进行选择。一

c++ - 帮助解决这些警告。 [遗产]

我有一组代码,它模拟了一个基本的图书馆编目系统。有一个名为items的基类,其中定义了通用id、title和year变量以及其他3个派生类(DVD、Book和CD)。基础[元素]派生[DVD、书籍、CD]。程序运行,但我收到以下警告,我不确定如何解决这些问题。>"C:\ProgramFiles\gcc\bin/g++"-Os-mconsole-g-Wall-Wshadow-fno-commonmainA4.cpp-omainA4.exeInfileincludedfrommainA4.cpp:5:a4.h:Inconstructor`DVD::DVD(int,std::string,i

c++ - 有没有办法让 "delete"成为一个纯虚函数?

我有一个带有几个纯虚函数的抽象类,我从它派生的类之一不使用其中一个纯虚函数:classderivative:publicbase{public:intsomevariable;voidsomefunction();};无论如何,当我尝试编译它时,我得到一个错误(显然,如果从抽象类派生并且不覆盖所有纯虚函数,类仍然被认为是抽象的)。无论如何,定义一个函数似乎毫无意义intpurevirtfunc(){return0;}只是因为它需要通过技术来定义。无论如何从抽象类派生类而不使用抽象类的纯虚函数之一? 最佳答案 如果派生类不“使用”基类

c++ - 虚拟继承是如何工作的?

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭10年前。虚拟继承是否使用vTable?如果是或否,那么它是如何实现的虚拟继承在内存中的表现如何?虚拟继承的任何其他替代方案非常感谢概念性的解释。

c++ - 为什么 pA、pB、pC 不相等?

考虑下面的程序#includeusingnamespacestd;classClassA{public:virtual~ClassA(){};virtualvoidFunctionA(){};};classClassB{public:virtualvoidFunctionB(){};};classClassC:publicClassA,publicClassB{};voidmain(){ClassCaObject;ClassA*pA=&aObject;ClassB*pB=&aObject;ClassC*pC=&aObject;coutpA,pB,pC应该是相等的,结果却是pA=0031

c++ - "method injection"的这种虚拟继承使用模式是已知范例吗?

昨天,我遇到了这个问题:forcingunqualifiednamestobedependentvalues最初,这似乎是一个与破坏VC++行为相关的非常具体的问题,但是在尝试解决它时,我偶然发现了一种我以前从未遇到过的虚拟继承的使用模式(我会在告诉你之后解释一下)我的问题)。我发现它很有趣,所以我在SO和google上寻找它,但我找不到任何东西。也许,我只是不知道它的正确名称(“方法注入(inject)”是我的猜测之一)而且它实际上广为人知。这也是我向社区提出的问题的一部分:这是一种常见的使用模式还是另一种已知范式的特例?您是否看到可以通过不同的解决方案避免的任何问题/陷阱?这个模式

c++ - 检测基类分配给指向派生类的引用

我目前正在研究多态类型和赋值操作之间的相互作用。我主要担心的是,是否有人可能会尝试将基类的值分配给派生类的对象,这会导致问题。来自thisanswer我了解到基类的赋值运算符总是被派生类的隐式定义的赋值运算符隐藏。所以对于简单变量的赋值,不正确的类型会导致编译器错误。但是,如果赋值是通过引用发生的,则情况并非如此:classA{public:inta;};classB:publicA{public:intb;};intmain(){Aa;a.a=1;Bb;b.a=2;b.b=3;//b=a;//good:won'tcompileA&c=b;c=a;//bad:inconcistenta

c++ - 虚继承与多态 : Is the cereal library messing with object layout?

我有四个类(A、B、C和D)遵循经典菱形图案和Container包含unique_ptr的类.我想使用cereal序列化这些类序列化库。structA{intf1;intf2;intf3}structB:publicvirtualA{templateinlinevoidsave(Archive&ar)const{std::cerrf1)f2)f3)f1f2f3CEREAL_REGISTER_TYPE(B);CEREAL_REGISTER_TYPE(C);CEREAL_REGISTER_TYPE(D);structContainer{std::unique_ptrobj;template

c++ - 访问 Protocol Buffer 扩展字段

我正在使用C++中的ProtocolBuffer。我的消息只有一个扩展范围。我想在不知道他们的名字的情况下访问所有的扩展字段,只使用他们的号码。我该怎么做??messageBase{optionalint32id=1;extensions1000to1999;}extendBase{optionalint32id2=1000;}到目前为止,我已经获得了ExtensionRange。constgoogle::protobuf::Descriptor::ExtensionRange*rng=desc->extension_range(0);std::cerrstartend但我不知道如何获

c++ - 涉及私有(private)继承的 C 风格向上转型和向下转型

考虑以下代码:-classA{};classB:privateA{};B*bPtr1=newB;//A*aPtr1=bPtr1;//error//A*aPtr2=static_cast(bPtr1);//errorA*aPtr3=(A*)bPtr1;B*bPtr2=(B*)aPtr3;当隐式和static_cast都失败时(还有dynamic_cast),C风格的转换丢弃了私有(private)继承。为什么?如果C风格的转换只是一些小事,那么C++转换是如何实现的,即它们如何从内存占用中知道继承类型?在将bPtr1转换为aPtr3之后,我将不得不使用另一个C风格的转换来向下转换为B,因