在C ++或任何其他编译语言中,是否可以在不修改标题的情况下向类添加功能?
在JavaScript中,我可以在创建对象后向对象添加一个函数。在C ++中甚至可以进行远程操作吗?
一个使用示例是我为用户提供一些routine.o
文件,并让他们扩展它,类似
void routine::NeverBeforeDeclaredFunction() { ... }
这个确切的例子是不允许的,但有什么相似之处?我已经考虑过让这个类有一个函数指针数组,并让用户使用自己的函数填充该数组。但这并没有提供任何优势,例如访问私有变量或访问this
。
答案 0 :(得分:3)
是否有可能,在C ++中
不,你不能在运行时或在C ++的编译时这样做。至少不是没有多少头痛的便携。您可以创建一个子类,但它不是“同一个类”。如果类是模板类,您可以提供自己的特化(但它是不同的类型)。
C ++ / CX(C ++的Microsoft语言扩展)允许partial classes。如果您不关心可移植性,这可能是您的问题的解决方案。请注意,它是在编译时完成的。
或任何其他编译语言,在不修改标题的情况下向类添加功能?
Objective-C允许通过类别(编译时)和Objective-C运行时(运行时)。
答案 1 :(得分:1)
在编译语言中,Objective C更具动态性,但它的功能与Javascript不同,Javascript是一种基于原型的继承语言。
你在C ++中可以做的是提供一个带有std::string
的虚方法,并返回一个函数指针,它将你的类的一个实例作为它的第一个参数,用于一个穷人的动态调度版本。在这个实例中唯一需要共享的是函数指针的类型。
答案 2 :(得分:1)
成员函数(非虚拟)都有一个隐含的“this”参数,允许它们访问父对象的成员,也许你可以使用具有显式“this”参数的函数指针。至于访问私有成员,您可以尝试将这些功能声明为朋友(不幸的是需要更改标题)。
答案 3 :(得分:0)
问题不在"编译" vs"未编译"语言,但严格键入"严格键入"并且"弱类型"语言。
对于严格类型化的面向对象语言,只有类的扩展才能引入新方法。这是#34;对象"的重点。但扩展对象还需要您可以控制对象的创建。
然而,偶尔会出现这样的需求 - 而且每种语言都会提供一些东西,这些东西可以看起来像是"扩展" (避免"扩展"因为这是此上下文中的OO术语)现有的东西。
例如,C ++使用流的方法重载,因此可以使其工作:cout << var_of_some_non_standard_type;
在C#中你有扩展方法 - 在你自己的代码中你可以假装一个类有更多的方法。编译器将它们映射到静态方法。
在Java中,您还可以通过在自己的代码中使用函数的静态导入来假装一点点。
答案 4 :(得分:0)
这取决于扩展功能的含义。
通常,扩展功能转换为扩展类。因此,是,您可以从类派生并添加更多功能,同时仍保留基类的类型。继承是is-a
关系。
如果您指的是在不扩展或修改标题的情况下向现有类添加功能,那么不,这是不可能的。如果你问我,这是件好事。