草庐IT

c++ - 将 Derived*const 转换为 Base*const

编辑-将问题置于上下文中。给定:structBase{...};structDerived:publicBase{...};classAlice{Alice(Base*const_a);...};classBob:publicAlice{Bob(Derived*const_a);...};当我尝试实现时Bob::Bob(Derived*const_d):Alice(static_cast(_d)){}它不起作用。const_cast对我来说没有意义,因为我不想更改常量,而且我没有更改我指向的内容,那么为什么g++会告诉我invalidstatic_castfromtype‘Derive

c++ - 在 C : Derived to base conversions 中包装 C++

我正在将一个简单的C++继承层次结构包装到“面向对象的”C中。我试图弄清楚在将指向C++对象的指针视为指向不透明C结构的指针时是否存在任何问题。特别是在什么情况下派生到基的转换会出现问题?类本身比较复杂,但层级较浅,仅采用单继承://AbaseclasswithlotsofimportantsharedfunctionalityclassBase{public:virtualvoidsomeOperation();//Moreoperations...private://Data...};//OneofseveralderivedclassesclassFirstDerived:pub

c++ - 如何在抽象类中声明重载运算符并在派生的非抽象类中覆盖它?

我正在尝试编写一个带有一些纯虚拟二元运算符的抽象类,这些运算符应该由派生类实现,以实现运算符多态性。这是一个简化的示例:classBase{public:virtualconstBase&operator+(constBase&)const=0;};classDerived:publicBase{public:constDerived&operator+(constDerived&)const;};constDerived&Derived::operator+(constDerived&rvalue)const{returnDerived();}现在运算符做什么并不重要,重要的是它返回

c++ - 虚拟继承的价格是多少?

这似乎是一个基本问题,但我没有看到它被问到:假设以下简单情况:没有虚拟成员。虚拟继承用于允许多个路径指向同一基。就访问最派生类的成员所需的时间而言,虚拟继承的代价是多少?特别是,如果价格不为零,它是仅适用于通过多条路径继承的成员还是也适用于其他成员? 最佳答案 Whatisthepriceofvirtualinheritanceintermsofthetimeneededtoaccessthemembersofthemostderivedclass?一个偏移查找和一个加法(2条指令和一个内存获取)Inparticular,ifthe

c++ - 删除运算符如何使用指向基类的指针释放内存

考虑这段代码:classbase{T*obj=newT[40];//...public:base(){/*...*/}virtual~base(){delete[]obj;//...}...};classderived:publicbase{T*obj2=newT[20];//...public:derived(){/*...*/}~derived(){delete[]obj2;//...}...};voidfunc(){base&&exmp=giveder();//giveder()returnsderivedbase*dis=newderived[50];//...delete[]

c++ - 帮助类型特征

假设我们有以下模板类templateclassWrap{/*...*/};我们无法改变Wrap.这很重要。让有派生自Wrap的类.例如,classNewInt:publicWrap{/*...*/};classMyClass:publicWrap{/*...*/};classFoo:publicWrap{/*...*/};我们也不能改变这些类。以上所有类(class)都是第3方。它们不是我的。我需要以下编译时间type_traits:templatestructis_derived_from_Wrap{staticconstboolvalue=/**/;};我需要什么?assert(i

使用将在派生构造函数中构造的参数调用的 C++ 基本构造函数

问题1)classBase{Base(std::stringname);virtualstd::stringgenerateName();}classDerived:Base{Derived();virtualstd::stringgenerateName();}问题来了:将在generateName()上调用什么方法?Derived::Derived:Base(generateName()){//whatmethodwillbecalledongenerateName()?}问题2)我应该怎么做?如果默认构造函数必须接受一个参数,但我需要在Derived构造函数中生成该参数?

c++ - 错误 LNK2001 : unresolved external symbol C++

在我之前编译良好的VC++代码中,我添加了一个函数X(),如下所示:InthefileBaseCollection.hclassBase{//codevirtualHRESULTX();//code};INthefileDerivedCollection.hclassDerived:publicBase{HRESULTX();}InthefileDerivedCollection.cppHRESULTDerived::X{//definitionofDerivedhere.}已将头文件正确地包含在.cpp文件中。但我仍然不明白为什么会出现链接错误:errorLNK2001:unreso

派生对象上基于 C++11 范围的 for 循环

如果我有一个指向父类的指针vector,并且该vector是通过实例化从父类派生的对象来初始化的,那么我似乎无法使用基于范围的for循环来获取元素作为派生对象。这是一个简单的例子:#includeclassParent{};classDerived:publicParent{};intmain(){std::vectorobjects{newDerived(),newDerived()};for(Derived*d:objects){//ERROR//Used}return0;}有没有一种干净的方法来做我想做的事(即循环遍历派生对象)?我知道可以做这样的事情:for(Parent*p:

c++ - 在基类和派生类中 copy-and-swap

我最近读到copy&swap现在我正在尝试在基类和派生类中实现ctors。我的基类和派生类中都有四个构造函数,但是我不确定如何实现派生类的赋值运算符。explicitBase(inti):m_i{i}{}Base(constBase&other):m_i{other.m_i}Base(Base&&other):Base(0){swap(*this,other);}Base&operator=(Baseother){swap(*this,other);return*this;}friendvoidswap(Base&a,Base&b)noexcept{usingstd::swap;swa