草庐IT

msf会话派生cs

全部标签

c++ - 什么时候应该限制派生类中虚函数的可访问性?

考虑以下代码:classBase{public:virtualvoidFoo(){}};classDerived:publicBase{private:voidFoo(){}};voidfunc(){Base*a=newDerived;a->Foo();//fine,callsDerived::Foo()Derived*b=newDerived;//b->Foo();//errorstatic_cast(b)->Foo();//fine,callsDerived::Foo()}关于这个问题,我听到了两种不同的思想流派:保留与基类相同的可访问性,因为用户无论如何都可以使用static_c

c++ - 强制转换为派生类的 ptr 到 ptr

这个问题在这里已经有了答案:Conversionofpointer-to-pointerbetweenderivedandbaseclasses?(2个答案)关闭6年前。如果我没有指定对Base**的显式转换,为什么会出现编译错误?处理派生类时可以使用指向指针的指针吗?classBase{};classChild:publicBase{};voidSomeFunction(Base**ppoObj){}voidSomeFunction(Base*poObj){}intmain(){Child*c=newChild();//Thispassed.SomeFunction(c);SomeF

c++ - 派生类的聚合初始化

以下代码无法使用VisualStudio2017或在线GDB进行编译。我希望它能够编译,因为迭代器只是一个具有类型的类,并且它是从publicly继承的。这是不允许的还是在VS2017中不起作用?templatestructGen:publicstd::iterator{Tvalue;};intmain(){Geng=Gen{10};//thisdoesntGeng2=Gen{{},10};//neitherdoesthis}错误是ErrorC2440'initializing':cannotconvertfrom'initializerlist'to'Gen'

c++ - 为什么我不能从派生类中调用基类运算符?

考虑这段代码,它试图从派生类运算符调用基类比较运算符:structBase{protected:int_a;booloperator==(constBase&other)const{return(_a==other._a);}};structDerived:publicBase{booloperator==(constDerived&other)const{returnstatic_cast(*this)==static_cast(other);}};intmain(){Derivedb1,b2;if(b1==b2);}这失败了:main.cpp:25:61:error:'boolBa

c++ - 如何在基于派生类的大小的基构造函数中分配数组?

我有一个类层次结构。基类使用一些可从文件加载(并可在运行时重新加载)的调整参数。每个派生类都可以添加一些额外的参数。我正在寻找一种在基本构造函数中分配大小正确的参数数组的方法,这样我就不必在派生类中取消分配和重新分配。我希望有这样的东西,但它不起作用(参数总是有2个元素):classBase{staticintnParms;virtualintgetNParms(){returnnParms;}float*parameters;public:Base(){parameters=newfloat[this->getNParms()];parameters[0]=globalReloada

c++ - 派生的 C++ 类如何通过基指针克隆自身?

这是我正在尝试做的(这段代码不起作用):classBase{virtualBase*clone(){returnnewBase(this);}virtualvoidID(){printf("BASE");};classDerived:publcBase{virtualBase*clone(){returnnewDerived(this);}virtualvoidID(){printf("DERIVED");}}..Derivedd;Base*bp=&d;Base*bp2=bp->clone();bp2->ID();我喜欢的是看到打印出“DERIVED”...我得到的是“BASE”。我是

c++ - 为什么先调用基类构造函数再调用派生类构造函数

按照c++规则,在定义派生类对象时,先调用基类构造函数初始化基类成员,再初始化派生类构造函数。对于析构函数,规则恢复。我想知道为什么要遵守这条规则。为什么要先基类构造函数,再派生类构造函数?这样做有什么理由吗?或者仅仅因为它是c++的定义。谢谢, 最佳答案 因为派生类的成员可能依赖于基类的成员,所以必须先初始化基类的成员。你不能反驳。 关于c++-为什么先调用基类构造函数再调用派生类构造函数,我们在StackOverflow上找到一个类似的问题: https:

c++ - 不使用 RTTI 缓存不同派生类型的设计模式

假设我有一系列类都实现相同的接口(interface),可能用于调度:classFoo:publicIScheduler{public:Foo(Descriptord):IScheduler(d){}/*methods*/};classBar:publicIScheduler{public:Bar(Descriptord):IScheduler(d){}/*methods*/};现在假设我有一个Scheduler类,您可以要求为给定的描述符启动一个IScheduler派生类。如果它已经存在,您将获得对它的引用。如果不存在,则会创建一个新的。一个假设的调用类似于:Foo&foo=sche

c++ - 派生类中虚函数调用的优化

在派生类中调用虚函数以便编译器可以内联或以其他方式优化调用的最佳方法是什么?例子:classBase{virtualvoidfoo()=0;};classDerived:publicBase{virtualvoidfoo(){...}voidbar(){foo();}};我希望在bar()中对foo()的调用始终调用Derived::foo()。据我了解,调用将导致vtable查找,编译器无法优化它,因为可能有另一个类继承自Derived。我可以显式调用Derived::foo(),但如果Derived中有许多虚函数调用,那会变得冗长。我还感到惊讶的是,我无法在网上找到很多Materi

c++ - 非多态派生类的基类

我有以下类定义:classBaseHandle{/*Lotsofthings*/};classVertexHandle:publicBaseHandle{/*Onlystaticmembersandnon-virtualfunctions,defaultdtor*/};classEdgeHandle:publicBaseHandle{/*Dito*/};classFaceHandle:publicBaseHandle{/*Dito*/};所有类都没有虚函数或基类。派生类仅派生自BaseHandle,不添加任何非静态成员,也不添加非默认dtor。我想将Vertex-、Edge-和Face