gpt4 book ai didi

c++ - Lua 和伪造的 Typecast

转载 作者:太空宇宙 更新时间:2023-11-04 15:26:33 25 4
gpt4 key购买 nike

我在使用 Lua 和 C++(使用 LuaWrapper)时遇到了一些问题。假设我有这些类(class):

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 访问 FooFoo::getBar() ,问题是返回对象的类型是 Bar 并且我无权访问其 BarDerivedX 方法。

据我所知,Lua 中的对象/类只是具有分配给键的功能的元表,所以我想知道是否有办法将这些额外的功能从 BarDerivedX 类复制到 Bar 对象(这会起作用吗?),另外,这是最好的方法吗?还是我应该在让 Lua 访问它之前用 C++ 转换它?

最佳答案

在任何语言中,多态性的目的是不必关心某些东西到底是什么类型。如果你给某人,无论是 Lua 还是 C++,一个 Bar 对象,那么 Bar 应该有人们需要做任何他们需要做的事情的接口(interface)。

这就是虚函数的目的。 Bar 中定义的虚函数可以用 BarDerived1 中的不同行为覆盖。其他代码不必知道它们正在被传递给派生类;他们可以像往常一样拿一个 Bar

从另一个派生一个类通常只有两个原因。第一个是多态性:您想通过改变某些函数的行为来专门化一个类。

另一个原因是可以访问它的实现。例如,如果您正在制作 Unicode 字符串,则可以使用 std::basic_string 来存储编码数据。然后您可以私下从 std::basic_string 派生,从而允许您获得 std::basic_string 具有的存储优化,但您提供了不同的接口(interface)(因为私有(private)继承不允许外部世界知道你是从中派生出来的)。

如果您希望每个人都使用可以根据派生类具有不同行为的 Bar 对象,那么您应该使用虚函数和多态性。但是,如果您更改派生类中的接口(interface),那么这可能是设计问题的迹象。也许那些派生类根本不应该是派生类。也许它们应该是完全独立的类,Bar 实例可能有也可能没有,具体取决于一些初始化参数。

如果不具体说明您实际在做什么,就很难说更多。但一般来说,如果您正确使用基于继承的多态性,则不需要从 Bar 转换为更多派生版本。只需使用 Bar 界面即可。

关于c++ - Lua 和伪造的 Typecast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7397257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com