草庐IT

c++ - 从基类引用调用派生类方法

classMaterial{public:voidfoo(){cout我希望这会导致控制台显示“ClassUnusual_Material”。有什么办法可以做到这一点?在我的程序中,我有一个Material类,从中派生出其他更具体的Material。Material::foo()方法表示Material中的一种方法,它适用于大多数Material,但有时,需要为具有异常属性的Material定义另一个foo()。我程序中的所有对象都包含一个Material字段。如果为它们分配了不寻常的Material,我希望调用派生的、不寻常的foo。这可能非常简单,也可能是不可能的,但无论哪种方式我

c++ - C++ 中的根基类

.NET中的每个对象都(直接或间接)继承自公共(public)根基“对象”。C++中有这么一个公共(public)对象根吗?如何将任何对象传递给函数?publicvoidDoSomeStuff(objecto){...}编辑:澄清一下,目的:在那个函数中我想调用一个指向成员函数的指针。为此,我需要对象实例和指向所需函数的指针。为了简化可读性,我想制作一个包含这两个必需信息的包装器。我不确定这是否是最好的方法,但这是背景想法。 最佳答案 没有共同的基类;但是使用类似boost::any或更普遍的基于模板的方法优于void*。

c++ - 纯抽象基类上的虚拟析构函数

我有structIMyInterface{virtualmethod1()=0;virtualmethod2()=0;};GCC坚持认为我有structIMyInterface{virtualmethod1()=0;virtualmethod2()=0;virtual~IMyInterface(){};};我不明白为什么。纯界面就是关于界面的(duh)。析构函数是接口(interface)具体实现者的内部实现细节的一部分;它不构成界面的一部分。我理解整个切片问题(或者至少我认为我理解)所以我的问题是-GCC坚持这样做是否正确?如果是,为什么? 最佳答案

c++ - 基类的虚拟 friend 函数?

我正在学习这门语言,这是一个菜鸟的疑问。是否可以使用虚拟friend功能?我不知道这是否可能,我什至没有测试它,但它在某些情况下可能很有用。例如,对于重载的运算符DerivedClassdc;BaseClass&rbc=dc;cout我猜这是可能的,但我不确定,因为友元函数没有在类设计中实现,理论上也不是它的一部分(尽管在这个例子中,从概念上讲,operator编辑:我的担忧与这个例子有关:BaseClassbc;DerivedClassdc;BaseClass*pArr[2];pArr[1]=bc;pArr[2]=dc;for(inti=0;i在这个混合对象数组中,我希望为每个对象调

c++ - 为什么即使模板类没有基类, `this` 也是类型依赖表达式?

下面的代码可以编译无误:templatestructA{voidf(){this->whatever;}//whateverisnotdeclaredbefore};intmain(){Aa;}我知道这是因为this是一个类型相关的表达式,它为whatever进行名称查找被推迟,直到知道实际的模板参数。由于成员函数f()在这种情况下从未使用过,因此没有实例化A::f存在,并为whatever查找名称永远不会执行。我可以理解this如果类模板有一个依赖于类型的基础,那么它是依赖于类型的:templatestructB{Twhatever;};templatestructA:B{voidf

c++ - 将 reinterpret_cast 的派生类指针转换为基类指针未定义行为吗?

看一个简单的例子:structBase{/*somevirtualfunctionshere*/};structA:Base{/*members,overriddenvirtualfunctions*/};structB:Base{/*members,overriddenvirtualfunctions*/};voidfn(){Aa;Base*base=&a;B*b=reinterpret_cast(base);Base*x=b;//usexhere,callvirtualfunctionsonit}这个小片段是否有未定义的行为?reinterpret_cast定义良好,它返回base

c++ - 访问基类函数

classBase{public:voidfoo(){}};classDerived:publicBase{private:usingBase::foo;};intmain(){Derivedd;d.foo();}代码是否合法?usingBase::foo声明位于派生类的私有(private)部分。所以调用d.foo()不应该编译,对吗? 最佳答案 没错。现在检查现实......MinGWg++4.4.1:x.cpp:Infunction'intmain()':x.cpp:3:error:'voidBase::foo()'isina

c++ - 使用基类作为指针的安全容器

所以我在看这个问题MemoryAllocationExceptioninConstructor我的老板在他漂亮的回答中说不会调用析构函数。这让我很奇怪,如果我写structXBase{int*a;char*b;float*c;XBase():a(nullptr),b(nullptr),c(nullptr){}~XBase(){delete[]a;delete[]b;delete[]c;}};和structX:XBase{X(){a=newint[100];b=newchar[100];c=newfloat[100];}}然后,如果c的分配失败(抛出异常),那么将调用XBase的析构函数

c++ - 从依赖基类访问类型

有谁知道为什么using声明似乎不能用于从依赖基类导入类型名称?它们适用于成员变量和函数,但至少在GCC4.3中,它们似乎被类型忽略了。templatestructBase{typedefTvalue_type;};templatestructDerived:Base{//Version1:erroronconformingcompilersvalue_typeget();//Version2:OK,butunwieldyforrepeatedreferencestypenameBase::value_typeget();//Version3:OK,butunwieldyformany

c++ - 调用虚基类的重载构造函数

是否有一种(实用的)方法可以绕过正常的(虚拟的)构造函数调用顺序?示例:classA{constinti;public:A():i(0){cout输出:callingA()callingB(int)callingC(int)callingD(int)我想要的是这样的:callingA(int)callingB(int)callingC(int)callingD(int)如你所见,这里涉及到虚继承,导致D的构造函数先调用了A的构造函数,但由于没有提供参数,所以调用了A()。constinti需要初始化,所以我遇到了问题。我想做的是隐藏C的继承细节,这就是为什么我正在寻找一种方法来避免在D