草庐IT

天天向上

全部标签

c++ - 仅用于向上转换

我们都知道C风格的转换在C++中被认为是邪恶的。这就是为什么它们被const_cast取代的原因,static_cast,和dynamic_cast提供更多定制的转换,允许程序员只允许预期的转换类。到目前为止,还不错。但是,似乎没有内置语法来执行显式向上转换:一种在Base&baseRef=derived中执行隐式转换的方法。明确不允许相反。虽然我知道这是一个很小的极端情况(大多数时候隐式转换工作得很好),但我想知道有什么技术可以在用户代码中实现这样的强制转换。我在想一些类似的事情templateclassupcast{public:template::value>::type>upc

《向上生长》读书笔记

前言一开始认识跑哥是在一篇朋友圈爆火的文章上,在阅读后发现跑哥写的文章确实写得清晰易懂,并经常用我们熟悉的事物进行类比,让我们可以熟悉代入理解,并加强记忆,文章通俗易懂而无浮藻,让人眼前一亮,毕竟,在这个世界上有海量的文章,而是有用简洁能让人读懂的内容却很少。在粗略地全部翻了跑哥以前的文章后,发现他还写了几本书,本质上就是把公众号上的文章整合到一起,出版成书。于是我便决定拜读一下这些书,当成加深记忆,并动手写一篇读书笔记出来,毕竟跑哥的秘诀就是读完要做笔记发微博,写成自己的文字表达出来,才算自己的。关键词向上生长全篇围绕着这几个关键词展开:学习认知跨越阶层乐观积极选择周期与趋势财富运气魔鬼细节

c++ - 以不止一种方式向上转换为作为基类的 C++ 类(无需使用虚拟继承)

classA{};classB:publicA{};classC:publicA,publicB{};intmain(){Cc;A*pA=static_cast(&c);}在上面的代码中,类C是从类A派生而来的,有两种不同的路径:1.直接来自A2.间接通过B即A因此,当我将类C的对象转换为指向类A的指针时,Linux上的g++会报告以下错误:错误:A是C的不明确基数我也通过删除静态转换来尝试相同的代码,如下所示:A*pA=&c;但是,我仍然得到完全相同的错误。有什么解决办法吗?顺便说一句,在使用VisualC++编译器的Windows上同样可以正常工作而不会出错。我知道虚拟继承可以解决

c++ - 删除向上转换为基指针的对象数组

开始将一些库从msvc移动到mingw,并发现当有人想要删除一个arrayupcastedobjects时msvc的非常有趣的行为。即msvc做了一些黑魔法(它似乎喜欢这样做)并且波纹管代码执行得很好,但是在mingw中(4.7.2(崩溃。我相信mingw正在正确执行并且它的msvc巫术就是制作睡虫。代码:#includeclassfoo{staticintidgen;protected:intid;public:foo(){id=idgen++;std::coutmsvc2010的输出Hello(foo-0)Hello(bar-0)Hello(foo-1)Hello(bar-1)By

c++ - 为什么 dynamic_cast 可以用于非多态类型的向上转换?

参见here:dynamic_castcanonlybeusedwithpointersandreferencestoclasses(orwithvoid*).Itspurposeistoensurethattheresultofthetypeconversionpointstoavalidcompleteobjectofthedestinationpointertype.Thisnaturallyincludespointerupcast(convertingfrompointer-to-derivedtopointer-to-base),inthesamewayasalloweda

C++ 多重继承和向上转换的智能指针销毁导致 VS 2017 中的堆损坏

我在使用上面的代码时遇到了VS调试器的问题:classAnimal{public:};classStupid{public:};classDog:publicStupid,publicAnimal{public:};intmain(){std::unique_ptranimal=std::unique_ptr(newDog());animal.reset();return0;}此代码在执行涉及“ntdl.dll”和“wntdll.pdb”的“animal.reset()”后抛出错误。如果我点击“忽略”多次(3)次,以下是MSVC运行时库生成断言失败的表达式:1-_CrtIsValidH

c++ - 向上转换时的隐式转换与 static_cast

假设我有三个类:A(母亲,抽象),B和C,A的child。所以B和C继承自A(公有继承)。我有一个指向A的指针列表,我用B或C的指针填充它。问题是:在进行转换/转换时,哪种风格是首选?classA{};classB:publicA{};classC:publicA{};B*objB=newB();C*objC=newC();std::listmyList;//OptionA:staticcastconversionmyList.push_back(static_cast(objB));myList.push_back(static_cast(objC));//OptionB:impli

c++ - 使用 glm 在本地和全局方向上旋转和平移对象

我正在尝试实现功能,我可以在其中旋转/平移局部或全局方向的对象,就像在3D建模软件中一样,使用glm。像这样:voidRotate(floatx,floaty,floatz,boollocalOrientation);但我不知道如何让它工作。局部旋转旋转应该是这样的(?):m_Orientation*=glm::rotate(x,glm::vec3(1,0,0);m_Orientation*=glm::rotate(y,glm::vec3(0,1,0);m_Orientation*=glm::rotate(z,glm::vec3(0,0,1);//(m_Orientationisglm

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,因

c++ - 向上转换指向数据成员的指针及其多态行为

我试图将指向派生类数据成员的指针强制转换为指向基类数据成员的指针,但以下代码无法编译:classBase{public:virtualvoidf(){}};classDerived:publicBase{public:voidf()override{}};classEnclosing{public:Derivedmember;};intmain(){DerivedEnclosing::*p=&Enclosing::member;autobp=static_cast(p);//compileerror}所以我改用reinterpret_cast,代码编译:autobp=reinterpr