草庐IT

c++ - 为什么我不能将指向 Derived 类成员函数的指针强制转换为相同但属于 Base 类的成员函数?

对我来说,将void(Derived::*)()转换为void(Base::*)()看起来非常安全,如下所示代码:#include#includeusingnamespacestd;structBase{void(Base::*any_method)();voidcall_it(){(this->*any_method)();}};structDerived:publicBase{voida_method(){cout但是编译器在a.any_method=&Derived::a_method;处提示转换。这是防止细微编程错误的障碍,还是只是为了让编译器编写者的生活更轻松?是否有变通方法

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

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

c++ - CRTP 静态多态性 : Using the Base Class to Call Derived Methods

C++中virtual的主要好处之一是能够使用基类(指针或引用)调用派生方法。我正在阅读usingCRTPtoimplementstaticpolymorphism,但我不明白如何使用这种技术实现上面提到的内容,因为当需要模板时,我无法将函数声明为采用Base类型。在我看来,文章中描述的内容可以通过简单地使用函数重载来实现,所以我确信这种技术一定有更多。(PS:在对thisquestion的回答的评论中提到了这个确切的问题,但不幸的是没有人回复它:“vtables真正提供的是使用基类(指针或引用)来调用派生方法。你应该在这里展示它是如何用CRTP完成的。”)这是我的最小代码,它给出了错

c++ - 为什么即使 base 具有用户声明的构造函数也会发生零初始化?

这会打印出0,表示data是零初始化。为什么即使base具有用户声明的构造函数也会发生这种情况?structbase{base(){}intdata;};structderived:base{derived()=default;};intmain(){std::cout如果derived有一个用户声明的构造函数,那么它会打印出一个随机值。为什么零初始化依赖于派生类而不是基类? 最佳答案 规则是专门写来涵盖structS{inti;std::strings;};如果没有任何用户提供的构造函数,即使隐式生成的默认构造函数不是平凡的,S(

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

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

c++ - MI 和隐式复制构造函数错误(原为 : Under what conditions can a template be the copy constructor?)

我很确定这个问题的答案是,“模板永远不可能成为复制构造函数。”不幸的是,我只花了3个小时弄清楚为什么我会收到有关递归的警告,跟踪它到复制构造函数,看着调试器发疯,不让我看递归代码,最后跟踪到一个基础构造函数中缺少“&”。你看,我有一个复杂的基于策略的设计主机,它已经运行了一段时间了。我着手将两个策略合二为一并遇到了一个递归复制构造函数。将其缩小为一个策略,该策略需要提供一个构造函数,该构造函数可以采用一种XXX概念作为其参数,但在这种情况下,我只是放弃它。所以我写了structmy_policy{templatemy_polity(Tconst){}//missing'&'...oop

c++ - 可以将具有 Base 类型的 STL 容器转换为 Derived 类型吗?

是否可以将STL容器从Base类型转换为Derived类型?例如,我有两个vector。第一个是基类类型,第二个是派生类类型。classBase{//Code};classDerive:publicBase{//Code};用法vector*vec_base=newvector;//AddsomeDerivetypedatatovec_basevector*vec_derive=(vector*)(vec_base);//UsingelementsasDerivepointers.Worksfine.这样可以吗?(它工作正常,但我想对此发表一些评论)。非常感谢你。编辑:根据答案更新。说

c++ - C++ 中的多态性为什么不起作用?

classBase{public:virtualvoidf();voidf(int);virtual~Base();};classDerived:publicBase{public:voidf();};intmain(){Derived*ptr=newDerived;ptr->f(1);deleteptr;return0;}ptr->f(1);显示以下错误:“函数调用中的参数过多”。为什么这是不可能的?derived不是继承了base的所有功能并且可以自由使用其中的任何功能吗?我可以明确地调用它并且它会起作用,但为什么不允许这样做? 最佳答案

c++ - 使用虚拟析构函数会使非虚拟函数进行 v 表查找吗?

正是主题所问的。还想知道为什么CRTP的常见示例中没有提到virtualdtor。编辑:伙计们,请也发布有关CRTP问题的信息,谢谢。 最佳答案 只有虚函数需要动态调度(因此vtable查找),甚至在所有情况下都不需要。如果编译器能够在编译时确定什么是方法调用的最终覆盖,它就可以避免在运行时执行分派(dispatch)。如果需要,用户代码也可以禁用动态调度:structbase{virtualvoidfoo()const{std::cout关于是否应该在所有继承情况下都提供虚析构函数,答案是否定的,不一定。仅当代码删除通过指向基类型

c++ - 递增指向派生类的指针

我正在为指向派生类的指针编写一个程序。这是我的代码,#includeusingnamespacestd;classbase{inti;public:voidset_i(intnum){i=num;}intget_i(){returni;}};classderived:publicbase{intj;public:voidset_j(intnum){j=num;}intget_j(){returnj;}};intmain(){base*bp;derivedd[2];bp=d;d[0].set_i(1);d[1].set_i(2);coutget_i()get_i();return0;}程