草庐IT

c++ - 显式调用基类析构函数/构造函数是否合法?

就地析构和构造基类对象以重置基类已知的状态部分是否合法?classC:publicBaseClass{...};Cc;c.BaseClass::~BaseClass();new(static_cast(&c))BaseClass;如果我们可以访问类的源代码,显然还有其他方法可以实现此效果。但是,我想从语言的角度了解是否有特定原因导致这无效。 最佳答案 不,这是不合法的。不允许替换对象的基础子对象。C++113.8/7指定只有在以下情况下才能重用对象的存储theoriginalobjectwasamostderivedobject(1

c++ - operator const Base&() 是否应该用于不可访问的基类?

我希望有一个类允许访问其基本情况的const接口(interface),但不允许访问其他类。特别是:classB{};classA:privateclassB{public:operatorconstB&(){return*this;}};intmain(){Aa;constB&b=a;//Shouldthislinebeanerror?}g++给出了一个不可访问的基类错误。你们那里的语言专家认为这个错误在C++11/C++14中是正确的吗?是的,我意识到我可以(并且将会)这样做:intmain(){Aa;constB&b=a.operatorconstB&();}对这个构造的另一种方

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++ - 是否可以从一个基类动态转换到另一个基类?

比如我有这样的代码classBase1{virtualvoidwonderFULL()=0;};classBase2{//allthisweirdmembers};classDerived:publicBase1,publicBase2{//notsoweirdmembers};intmain(){DerivedWonder;magicFunction(&Wonder);return0;}voidmagicFunction(Base2*ptr){if(Base1*b1=dynamic_cast(ptr))b1->wonderFULL();}然而,由于无法将ptr转换为b1,因此永远不会

c++ - 如何在模板基类中调用模板成员函数?

在基类中调用非模板化成员函数时,可以将其名称通过using导入到派生类中,然后使用它。这是否也适用于基类中的模板成员函数?仅使用using它不起作用(使用g++-snapshot-20110219-std=c++0x):templatestructA{templatevoidf(){}};templatestructB:A{usingA::f;templatevoidg(){//g++throwsanerrorforthefollowingline:expectedprimaryexpressionbefore`>`f();}};intmain(){Bb;b.g();}我知道像在中那样

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

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

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

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

c++ - 使用基类指针访问派生类成员

我正在用C++制作一个简单的控制台游戏我想知道我是否可以在使用指向基类(“实体”)的指针时访问“entPlayer”类的成员:classEntity{public:voidsetId(intid){Id=id;}intgetId(){returnId;}protected:intId;};classentPlayer:publicEntity{stringName;public:voidsetName(stringname){Name=name;}stringgetName(){returnName;}};Entity*createEntity(stringType){Entity*E

c++ - 从派生构造函数调用基类方法

classBase{public:Base(){}voidFoo(intx){...}};classDerived:publicBase{public:Derived(intargs){/*processargsinsomeway*/Foo(result);}};是否允许在派生类的构造函数中调用基类的方法?我想这很好,因为应该完全构造Base对象,但我想检查一下以防万一。 最佳答案 Isitallowedtocallamethodofthebaseclassintheconstructorofthederivedclass?是的。请

c++ - 复制抽象基类的对象

如果我有一个指向派生自抽象基类的对象的指针(因此我无法创建该类的新对象),并且我希望对所述对象进行深度复制,是否有更简洁的方法完成那个而不是让抽象基类创建一个新的纯虚拟copy函数,每个继承类都必须实现? 最佳答案 不,但是copy方法并不一定很痛苦:classDerived:publicBase{public:Base*copy()const{returnnewDerived(*this);}};(假设您已经有一个复制构造函数,如果您需要深复制,您将拥有)。 关于c++-复制抽象基类的