我正在使用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{...}
Run Code Online (Sandbox Code Playgroud)
我可以访问Foo和Foo::getBar()从Lua 访问,事实是返回的对象的类型是Bar,我无法访问其BarDerivedX方法.
据我所知,Lua中的Objects/Classes只是MetaTables,其功能分配给键,所以我想知道是否有办法将这些额外的函数从BarDerivedX类复制到Bar对象(甚至可以工作吗?),也是这是最好的方法,或者我应该在让Lua访问之前用C++编译它?
在任何语言中,多态性的目的是不必关心什么类型的东西.如果你给一个人,无论是Lua还是C++,一个Bar对象,那么Bar应该有人们需要做的任何他们需要做的接口.
这就是虚函数的目的.定义的虚函数Bar可以用不同的行为覆盖BarDerived1.其他代码不必知道它们被传递给派生类; 他们总能Bar像往常一样.
通常只有两个理由使一个类派生自另一个.第一个是多态:你想通过改变某些函数的行为来专门化一个类.
另一个原因是获得对其实施的访问权.例如,如果您正在创建Unicode字符串,则可以使用std :: basic_string来存储编码数据.然后你可以私有地从std :: basic_string派生,从而允许你获得std :: basic_string具有的存储优化,但是你提供了一个不同的接口(因为私有继承不允许外部世界知道你从它派生的).
如果您希望每个人都使用Bar基于派生类可以具有不同行为的对象,那么您应该使用虚函数和多态.但是,如果要更改派生类中的接口,那么这可能是设计问题的一个标志.也许那些派生类根本不应该是派生类.Bar根据一些初始化参数,它们应该是完全独立的类,实例可能有也可能没有.
如果没有具体说明你实际在做什么,就很难说更多.但一般来说,如果您正确使用基于继承的多态,则不需要从Bar更多派生版本转换.只需使用Bar界面.