草庐IT

c++ - 编译时多态和运行时多态

我注意到多态性在某处仅指虚函数。但是,它们在某处包含函数重载和模板。后来发现有两个名词,编译时多态和运行时多态。真的吗?我的问题是,当我们普遍谈论多态性时,广泛接受的含义是什么? 最佳答案 是的,你是对的,在C++中有两种公认的多态“类型”。他们的意思和你想的差不多动态多态是C#/Java/OOP人们通常简称为“多态性”的东西。它本质上是子类化,要么从基类派生并覆盖一个或多个虚函数,要么实现一个接口(interface)。(这在C++中是通过覆盖属于抽象基类的虚函数来完成的)静态多态发生在编译时,可以被认为是ducktyping的一

c++ - boost序列化异常: unregistered class,序列化多态基础问题

我一直在阅读、交叉引用,但最终没有找到连贯的示例和答案。我想做的很简单,但我显然遗漏了一些东西。在英语中,我有一个具有两个抽象基础的类结构(纯BB派生自纯AA),我将其管理为:std::vector我想序列化另一个包含这个vector的对象。所有除了这个vector都可以很好地序列化,但是一旦它到达vector,它就会抛出:terminatecalledafterthrowinganinstanceof'boost::archive::archive_exception'what():unregisteredclass-derivedclassnotregisteredorexport

c++ - 在 OCaml 中,抽象的代价有多大(即多态函数)

我仍处于学习OCaml的早期阶段,并且很想知道从OCaml中的通用代码中提取最大性能的最佳方法是什么。作为一个小实验,我编写了两个多态函数:一个用C++编写,另一个用OCaml编写,用于查找给定数组中的最大元素。我观察到的是,虽然在C++中您不会为这种抽象付出代价,但在OCaml中的代价是性能大幅下降一个度数。顺便说一句,我快速编造的C++解决方案比OCaml解决方案更通用,但我主要将其归咎于我对这门语言缺乏经验。我的问题如下:如何在OCaml中编写和使用多态函数而不付出我刚刚观察到的巨大性能损失?对于这个特定问题,我观察到的另一件事是我在OCaml中的功能解决方案比命令式解决方案慢,

c++ - 什么是 C++ 中的参数和包含多态性

我正在地址https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html阅读一些C++文本.在UNIVERSALPOLYMORPHISM一节中,作者提到了Parametric和Inclusion多态性。我不太确定我是否理解这一点,特别是为什么Parametric多态性是在编译时实现的,而Inclusion多态性是在运行时实现的?谁能给我一个明确的解释或例子,好吗? 最佳答案 C++中的“Parametricpolymorphism”表

c++ - std::remove_if 来自 std::vector 的多态 std::unique_ptr

我有一个包含三个类的层次结构,其中Derived源自Selectable和Drawable.然后我有一个std::vector的std::unique_ptr我用Derived填充对象。我确定该vector将仅由同时从两个基派生的对象填充。当我尝试使用指向Selected的指针从vector中删除某个元素时,问题就来了.#include#include#includestructSelectable{virtual~Selectable()=0;};Selectable::~Selectable()=default;structDrawable{virtual~Drawable()=0

c++ - 关于CRTP静态多态的困惑

我正在努力研究CRTP。周围有一些很好的资源,包括这个论坛,但我想我对静态多态性的基础知识有些困惑。查看以下维基百科条目:templatestructBase{voidimplementation(){//...static_cast(this)->implementation();//...}staticvoidstatic_func(){//...T::static_sub_func();//...}};structDerived:publicBase{voidimplementation();staticvoidstatic_sub_func();};我知道这有助于我在派生类中有

c++ - 编译时多态性和静态绑定(bind)有什么区别?

This链接帮助我理解静态绑定(bind)和动态绑定(bind)之间的区别?但我很困惑静态绑定(bind)和编译时多态有什么区别还是没有区别。这也对动态绑定(bind)和运行时多态产生了疑问? 最佳答案 简而言之静态与动态绑定(bind)是关于何时要运行的确切代码(即函数的地址)是已知的:在编译时、链接时(均为“静态”)、加载或运行时(均为“动态”)。多态性首先是关于如何要运行的确切代码是已知的:要符合多态性,它必须从类型正在处理的数据。当数据的“动态类型”直到运行时才知道(通常是因为类型由运行时数据输入确定)时,必须使用动态绑定(

c++ - 多态类型的 typeid

我希望这段代码打印“Same1”和“Same2”,但它只打印“Same1”:#include#includeusingnamespacestd;structC{virtual~C(){}};structD:C{};intmain(){Dd;Cc,&cr1=d;if(typeid(cr1)==typeid(D))cout§5.2.8/2和§5.3.1/3似乎都建议我应该打印“Same2”。有什么收获? 最佳答案 指针不是多态类型。他们没有虚拟成员。事实上,他们没有任何成员。它们也不能从其他类型派生,也不能用作基类。因此,T*的静态和动

c++ - 虚函数是在 C++ 中实现运行时多态性的唯一方法吗?

我的一位friend问我“C++中的运行时多态性是如何实现的?”我回答“通过继承”他说“不行,只能用虚函数来实现”。所以我给了他一个下面代码的例子:-#includeusingnamespacestd;classA{public:inti;A(){i=100;}};classB:publicA{public:intj;B(){i=-1;j=99;}};voidfunc(A&myA){cout这里,函数func()引用了A,但我们传递了B的对象,我们可以打印公共(public)成员“i”的值。他说是编译时多态。我的问题是:-1)运行时多态性是否只能通过虚函数实现?2)上面的例子有运行时多

c++ - 当基类不是多态但派生时 'this' 地址不匹配

有这段代码:#includeclassBase{public:Base(){std::cout输出:Base:0xbfdb81d4Derived:0xbfdb81d4然而,当函数“fun”在派生类中更改为虚拟函数时:virtualvoidfun(){}//changedinDerived然后'this'的地址在两个构造函数中是不一样的:Base:0xbf93d6a4Derived:0xbf93d6a0另一件事是如果类Base是多态的,例如我在那里添加了一些其他虚函数:virtualvoidfunOther(){}//addedtoBase然后“this”的地址再次匹配:Base:0xb