polymorphism 相关问题

在计算机科学中,多态性是一种编程语言特性,它允许以统一的方式处理不同数据类型的值。

虚函数中协变返回类型的意义是什么?

我见过的协变返回类型最常见的用法是通过虚函数。我能想到的最简单的例子看起来像这样: 基类{ 民众: 虚拟基地&获取(...

回答 1 投票 0

C++ 多态性不适用于 ESP-IDF

我有一个抽象类 命名空间 AComp { A级 { 民众: 虚拟无效函数()= 0; 虚拟~A(); }; A::~A() { } } 我还有一个抽象子类,它没有

回答 1 投票 0

Go 语言中的多态性

我正在学习 go lang,我想知道是否有办法做这样的事情: 类型 Foo 结构 { ... } 类型 Bar 结构体 { 富 ... } func getFoo() Foo { 返回栏{...} } 在

回答 5 投票 0

限制模板参数是不好的做法吗?

在 C++ 中,根据此来源假设模板参数具有某些字段或方法是合法的。如果没有,它将无法编译。 模板 无效

回答 1 投票 0

为什么我的“setter”函数存储在 std::map 中,无法正确设置值?

我正在尝试编写一个基本的游戏引擎,并且遇到了有关动态组件创建的问题。我这里有一个最小的工作示例: #包括 #包括 我正在尝试编写一个基本的游戏引擎,并且遇到了有关动态组件创建的问题。我这里有一个最小的工作示例: #include <bitset> #include <variant> #include <map> #include <functional> #include <iostream> using Property = std::variant<int, unsigned int, bool, double, std::string>; class Component { public: std::map<std::string, std::function<void(Property)>> _setters; Component() {} virtual void DestroyComponent() {} }; class Transform : public Component { public: static std::string name() { return "Transform"; } void __set_x(Property p) { x = std::get<double>(p); } public: double x = 0; public: Transform() { _setters["x"] = [=](Property p){this->__set_x(p); }; } }; int main() { std::vector<Transform> ts = {Transform()}; Component* c = &ts[0]; c->_setters["x"](3.0); std::cout << ts[0].x << std::endl; return 0; } (请注意,格式方面的任何奇怪之处都来自于这样一个事实:为了方便起见,我的大多数组件都使用大量宏进行了定义。) 这将最终打印 0 并在应该打印 3 时返回。 现在的问题是这样的:我有一个子类的组件列表(这里表示为变换向量),我需要获取其中一个。在运行时,我不知道该类是什么,因此我通过引用元素的索引作为组件指针来获取它。当我的代码调用由 _setters[<property>] 链接到的函数时,它确实按预期进入该函数(通过将 print 函数放入 lambda 并调用函数来证明),但该值从未设置。通过调试,我还向自己证明,引用向量的索引会产生正确的内存地址,因此指针应该是正确的。所以我的问题是:为什么值设置不正确,如何修复它? 问题在于捕获 this 然后复制您的 Transform 对象。 在 Transform() 构造函数中,表达式 _setters["x"] = [=](Property p){this->__set_x(p); }; 捕获 this。这捕获了发生捕获时 this 的即时值,它无法捕获“当前对象”的概念。 当您构造 ts 时,您使用一个初始值设定项列表,该列表需要复制初始值设定项。在此复制过程中,_setters 被复制,包括原始对象的默认构造函数设置的 setter。它捕获的this仍然指向原始对象。 后来,当你调用c->_setters["x"](3.0);时,你成功运行了Transform指向的c的setter,但是这个setter是通过复制另一个Transform获得的。 setter 捕获的 this 仍然指向初始化列表中的原始实例。它并不指向c。 setter 尝试为不再存在的实例设置 x 的值,从而导致未定义的行为。 您可以通过添加复制构造函数来解决该问题。 Transform(Transform const& copy) : Component(copy) { _setters["x"] = [=](Property p){this->__set_x(p); }; }

回答 1 投票 0

数据库中的多态性

我想为一组玩家建模一个数据库实体。 每个玩家应该具备: 许多固定字段(名称、角色……) 技能级别的多个可变字段(如果角色是 ATK,则...

回答 2 投票 0

如何使用 Kotlin 序列化器序列化原始对象列表?

我有一个 json 响应,它是对象列表的列表,我正在尝试序列化它。如何使用 kotlin 序列化器序列化它? { “身体”: [ [ “新鲜苹果 - 皇家...

回答 2 投票 0

字符串操作宏:‘,’标记之前预期有说明符限定符列表

我正在尝试编写一个宏,它将自动定义由组合和函数指针存档的多态类型。 我对宏字符串操作不太了解。这是嗬...

回答 1 投票 0

多态是否允许在子类中重写其超类的所有方法?

请举例说明! 然而,子类并不强制覆盖超类中的所有方法。 它提供了覆盖方法的选项,但它不是......

回答 2 投票 0

编译器选择了错误的重载

好吧,我有一个派生类,它对我的基类上的方法有重载。我称之为我认为与基类的方法签名相匹配的内容,但我的派生类实现了...

回答 2 投票 0

根据收到的子类做不同事情的模式?

目前我有类似于以下数据类的东西,我希望 CreateScheduledEventRequest 的接收者在 ScheduleInfo 是 RepeatingTask 时与...时执行不同的操作

回答 1 投票 0

我应该使用抽象类加子类还是ENUM或抽象类加接口?

正在解决这样的任务 创建一棵树,然后创建一棵橡树、无花果树、松树、苹果树、橙树...... 请记住,有些树可以结出果实。 然后创建一个有树木的森林并制作所有

回答 1 投票 0

是否可以将 SwigObject 向下转换为具体类型?

我有几个 C 文件: /*mid.h*/ #ifndef mid_h #定义mid_h #include typedef struct PtrRec *Ptr, PtrStruct; #endif /*mid_h*/ /*左.h*/ #ifndef left_h #定义left_h #

回答 1 投票 0

相互依赖的泛型类?

本文底部是一个解决方案的示例,尽管该示例显然是无效的,因为它在继承时使用了 BaseNode 和 BaseEdge 而没有提供类型。 我很...

回答 3 投票 0

使用XmlSerializer序列化派生类

我正在使用 XmlSerializer 序列化包含通用列表的对象 列表 子项 {get;set} 问题是每个元素都派生自 ChildBase,它实际上是一个ABS...

回答 3 投票 0

在C中释放向上转型的结构体,安全吗?

我正在编写一些多态 C 代码,我想知道下面介绍的两个内存释放函数是否都能正常工作。我很确定 void free_casted_parent(Parent* Parent) 是正确的,b...

回答 2 投票 0

如何根据条件从函数模板返回不同类型?

我有以下代码: 助手.hpp : 结构体A { uint32_t a,b; }; 结构体 B { uint32_t a,b; }; 模板 结构体C{ T条码; }; 现在基于一些条件...

回答 4 投票 0

Java多态继承

B级{ 公共无效打印(字符串s){ System.out.println('B'); } } D 类扩展 B{ 公共无效打印(对象o){ System.out.println('D'); } } 。 。 。 公共...

回答 1 投票 0

如何使用 GetRecord 将具有单个标头的 CSV 文件中的数据解析为不同类型的实例?

我尝试按照链接https://joshclose.github.io/CsvHelper/examples/reading/reading-multiple-record-types/中的方法来实现转换单个CSV的特定要求...

回答 1 投票 0

如何从(仅)<T>不同的函数返回通用结构体

我正在寻求有关正确语法或 Rust 方法的帮助。我的用例:我有一个通用结构 FileData,其中有一个名为提供者的变量。提供商必须实现 AsRef<[u8]>,以便...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.