草庐IT

c++ - 将 std::function<void(Derived*)> 转换为 std::function<void(Base*)>

首先,我定义了两个类,它们相互继承。classA{};classB:publicA{};然后,我声明一个使用std::function的函数:voiduseCallback(std::functionmyCallback);最后,我收到了std::function与我想在回调函数中使用的其他地方不同(但理论上兼容)的类型:std::functionthisIsAGivenFunction;useCallback(thisIsAGivenFunction);我的编译器(clang++)拒绝这样做,因为thisIsAGivenFunction的类型与预期的类型不匹配。但与B继承自A,这对t

c++ - 在 C++ 中重新定义与覆盖

我对派生类中重新定义和覆盖函数之间的区别感到困惑。我知道-在C++中,重新定义的函数是静态绑定(bind)的,重写的函数是动态绑定(bind)的,并且一个虚函数被重写,一个非虚函数被重新定义。当派生类“重新定义”基类中的方法时,它被认为是重新定义。但是当派生类是虚拟的时,它不再重新定义而是覆盖。所以我了解规则的逻辑,但我不了解底线。在下面的示例中,函数SetScore被重新定义。但是,如果我将基类中的setScore函数设为虚拟(通过向其添加单词virtual),派生类中的setScore将被覆盖。我不明白底线-有什么区别。在setScore中?基类:classGradedActivi

c++ - 在 C++ 中重新定义与覆盖

我对派生类中重新定义和覆盖函数之间的区别感到困惑。我知道-在C++中,重新定义的函数是静态绑定(bind)的,重写的函数是动态绑定(bind)的,并且一个虚函数被重写,一个非虚函数被重新定义。当派生类“重新定义”基类中的方法时,它被认为是重新定义。但是当派生类是虚拟的时,它不再重新定义而是覆盖。所以我了解规则的逻辑,但我不了解底线。在下面的示例中,函数SetScore被重新定义。但是,如果我将基类中的setScore函数设为虚拟(通过向其添加单词virtual),派生类中的setScore将被覆盖。我不明白底线-有什么区别。在setScore中?基类:classGradedActivi

java - 构造函数中的虚函数,为什么语言不同?

在C++中,当从构造函数中调用虚函数时,它的行为不像虚函数。我认为第一次遇到这种行为的每个人都感到惊讶,但第二次认为这是有道理的:只要派生的构造函数还没有被执行,对象就不是还是一个派生的实例。那么如何调用派生函数呢?前提条件还没来得及设置。示例:classbase{public:base(){std::coutJava和.NET完全一样,但他们选择了另一种方式,这可能是最小意外原则的唯一原因?你认为哪个是正确的选择? 最佳答案 语言定义对象生命周期的方式存在根本差异。在Java和.Net中,对象成员在任何构造函数运行之前被初始化为零

java - 构造函数中的虚函数,为什么语言不同?

在C++中,当从构造函数中调用虚函数时,它的行为不像虚函数。我认为第一次遇到这种行为的每个人都感到惊讶,但第二次认为这是有道理的:只要派生的构造函数还没有被执行,对象就不是还是一个派生的实例。那么如何调用派生函数呢?前提条件还没来得及设置。示例:classbase{public:base(){std::coutJava和.NET完全一样,但他们选择了另一种方式,这可能是最小意外原则的唯一原因?你认为哪个是正确的选择? 最佳答案 语言定义对象生命周期的方式存在根本差异。在Java和.Net中,对象成员在任何构造函数运行之前被初始化为零

c++ - 从多态容器中提取已知接口(interface)时的奇怪行为

谁能帮我理解这种行为?简而言之:我已将多态对象存储在一个通用容器中。其中一些实现了特定的接口(interface)。我可以分辨出哪些。但是我不能使用这个界面。以下是我总结的:#include#include//AbaseclassstructBase{//Apolymorphicmethodvirtualvoiddescribe()const{std::coutdescribe();//"Base"d->describe();//"Derived"//Ok.//Testinterface:d->specific();//"DerivedusesInterface"Interface*i

c++ - 从多态容器中提取已知接口(interface)时的奇怪行为

谁能帮我理解这种行为?简而言之:我已将多态对象存储在一个通用容器中。其中一些实现了特定的接口(interface)。我可以分辨出哪些。但是我不能使用这个界面。以下是我总结的:#include#include//AbaseclassstructBase{//Apolymorphicmethodvirtualvoiddescribe()const{std::coutdescribe();//"Base"d->describe();//"Derived"//Ok.//Testinterface:d->specific();//"DerivedusesInterface"Interface*i

c++ - GCC/VS2008 : Different behaviour of function call when templated base class is derived from itself

以下代码适用于VisualStudio2008,但不适用于GCC/G++4.3.420090804。根据C++标准,哪种行为正确?templatestructA:A{};templatestructA{};structB:A{};templatevoidFunc(constA&a){}intmain(){Aa;//isderivedfromAFunc(a);//vs2008:ok,g++:ok//Comeau:okBb;//isderivedfromAFunc(b);//vs2008:ok,g++:error,nomatchingfunctionforcalltoFunc(B&)//C

c++ - GCC/VS2008 : Different behaviour of function call when templated base class is derived from itself

以下代码适用于VisualStudio2008,但不适用于GCC/G++4.3.420090804。根据C++标准,哪种行为正确?templatestructA:A{};templatestructA{};structB:A{};templatevoidFunc(constA&a){}intmain(){Aa;//isderivedfromAFunc(a);//vs2008:ok,g++:ok//Comeau:okBb;//isderivedfromAFunc(b);//vs2008:ok,g++:error,nomatchingfunctionforcalltoFunc(B&)//C

C++:错误 "... is not derived from type ..."

templateclassBimap{public:classData;typedefData*DataP;typedefstd::multimapT1Map;typedefstd::multimapT2Map;classData{private:Bimap&bimap;T1Map::iteratorit1;/*...*/};};这给了我这个编译错误:error:type'std::multimap::Data*,std::less,std::allocator::Data*>>>'isnotderivedfromtype'Bimap::Data'这是什么意思?这里有什么问题?