Lua和伪造类型转换
2011-9-13 5:34:5
收藏:0
阅读:132
评论:2
我正在使用Lua和C++(使用LuaWrapper),遇到了一些问题。假设我有以下这些类:
class Bar{...};
class Foo
{
...
std::map<std::string,Bar*> _barlist;
...
Bar* getBar(std::string key)
{
return _barlist[key];
}
}
class BarDerived1 : public Bar{...}
class BarDerived2 : public Bar{...}
我可以从Lua访问Foo
和Foo::getBar()
,问题在于返回的对象类型是Bar
,我无法访问其BarDerivedX
方法。
据我所知,Lua中的对象/类只是具有分配给键的函数的元表,因此我想知道是否有一种方法可以将这些额外的函数从BarDerivedX
类复制到Bar
对象中(这会起作用吗?),此外,这是最好的方法还是在Lua访问之前应该在C++中进行转换?
原文链接 https://stackoverflow.com/questions/7397257
点赞
stackoverflow用户312586
在类的继承中有一个基本原则:
超类的实例必须能够被任何其子类的实例替换。
如果 B 是 A 的子类,那么在任何使用 A 的地方,都应该能够使用 B 的实例。
如果你的代码没有做到这一点,那么你就没有正确使用继承。如果你创建一个子类的唯一原因是为了使创建集合更简单,那肯定是使用不当的。
正如其他人所说,一个正确的解决方案是在集合声明中使用“通用类型”。完全删除 Bar
,并在集合声明中使用 boost::variant
、空指针或者你工具集中的等价物。
2011-09-13 17:51:04
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
多态性的目的是什么?
无论是在哪种语言中,多态性的目的都是不必关心确切的类型。如果你给某人(Lua或C++)一个
Bar
对象,那么Bar
应该有人们需要完成他们需要做的任务的接口。这就是虚函数的目的。在
Bar
中定义的虚函数可以在BarDerived1
中被重写为不同的行为。其他代码不用知道他们正在得到一个派生类;他们可以像往常一样使用一个Bar
。通常只有两个原因会使一个类派生自另一个类。第一个原因是多态性:你想通过改变某些函数的行为来特化一个类。
另一个原因是为了获得其实现。例如,如果你正在制作一个 Unicode 字符串,可以使用
std::basic_string
来存储编码数据。您可以从std::basic_string
私下地 派生,从而允许您获得std::basic_string
所具有的存储优化,但提供不同的接口(因为私有继承不允许外部世界知道您从中派生)。如果您想让所有人都使用可以根据派生类具有不同行为的
Bar
对象,则应使用虚函数和多态性。但是,如果您正在_更改_派生类中的接口,那么这可能是设计问题的迹象。也许这些派生类根本不应该是派生类。也许他们应该是完全不同的类,由一个Bar
实例有或没有,根据一些初始化参数。如果没有具体的工作细节,很难说更多。但通常,如果您正确使用基于继承的多态性,就不需要从
Bar
转换到更多派生版本。只需使用Bar
接口即可。