草庐IT

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;}程

C++ 继承,隐藏的基本方法

我有一个简单的C++基类、派生类示例。//Base.hpp#pragmaonceclassBase{public:virtualfloatgetData();virtualvoidsetData(floata,floatb);virtualvoidsetData(floatd);protected:floatdata;};//Base.cpp#include"stdafx.h"#include"Base.hpp"floatBase::getData(){returndata;}voidBase::setData(floata,floatb){setData(a);}voidBase::

C++ 纯虚方法

考虑这个演示程序:#includeclassBase{public:virtualintf(int)=0;virtualintf(){returnf(0);}virtual~Base(){}};classDerived:publicBase{public:intf(inti){return(10+i);}};intmain(void){Derivedobj;printf("%d\n",obj.f(1));//Thisworks,andreturns11printf("%d\n",obj.f());//Addingthislinegivesmetheerrorlistedbelow}这给

c++ - 我如何创建一个模板是特定类型的编译时断言?

我有一个模板函数,希望在编译时确保它不会在特定类的子类型或父类(superclass)型上实例化。如果违反此规定,我如何导致C++编译器错误?classbase{};classderived:publicbase{};classlowest:publicderived{};templateboolisCorrect(constT&obj){typedeffooD;foo*def=foo::find();return(def&&def->getAnswer(object));}我希望isCorrect仅适用于derived类,但不适用于base或lowest。请注意,可能有许多其他最低类

c++ - dynamic_cast 失败

我有一个基类和一个派生类。每个类都有一个.h文件和一个.cpp文件。我在下面的代码中将基类对象动态转换为派生类:h文件:classBase{public:Base();virtual~Base();};classDerived:publicBase{public:Derived(){};voidfoo();};classAnother{public:Another(){};voidbar(Base*pointerToBaseObject);};cpp文件:Base::Base(){//dosomething....}Base::~Base(){//dosomething....}voi