Lua和伪造类型转换

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

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

原文链接 https://stackoverflow.com/questions/7397257

点赞
stackoverflow用户734069
stackoverflow用户734069

多态性的目的是什么?

无论是在哪种语言中,多态性的目的都是不必关心确切的类型。如果你给某人(Lua或C++)一个 Bar 对象,那么 Bar 应该有人们需要完成他们需要做的任务的接口。

这就是虚函数的目的。在 Bar 中定义的虚函数可以在 BarDerived1 中被重写为不同的行为。其他代码不用知道他们正在得到一个派生类;他们可以像往常一样使用一个 Bar

通常只有两个原因会使一个类派生自另一个类。第一个原因是多态性:你想通过改变某些函数的行为来特化一个类。

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

如果您想让所有人都使用可以根据派生类具有不同行为的 Bar 对象,则应使用虚函数和多态性。但是,如果您正在_更改_派生类中的接口,那么这可能是设计问题的迹象。也许这些派生类根本不应该是派生类。也许他们应该是完全不同的类,由一个 Bar 实例有或没有,根据一些初始化参数。

如果没有具体的工作细节,很难说更多。但通常,如果您正确使用基于继承的多态性,就不需要从 Bar 转换到更多派生版本。只需使用 Bar 接口即可。

2011-09-13 06:18:27
stackoverflow用户312586
stackoverflow用户312586

在类的继承中有一个基本原则:

超类的实例必须能够被任何其子类的实例替换。

如果 B 是 A 的子类,那么在任何使用 A 的地方,都应该能够使用 B 的实例。

如果你的代码没有做到这一点,那么你就没有正确使用继承。如果你创建一个子类的唯一原因是为了使创建集合更简单,那肯定是使用不当的。

正如其他人所说,一个正确的解决方案是在集合声明中使用“通用类型”。完全删除 Bar,并在集合声明中使用 boost::variant、空指针或者你工具集中的等价物。

2011-09-13 17:51:04