在不修改标头的情况下扩展C ++类

时间:2012-02-13 17:39:26

标签: c++ scripting

在C ++或任何其他编译语言中,是否可以在不修改标题的情况下向类添加功能?

在JavaScript中,我可以在创建对象后向对象添加一个函数。在C ++中甚至可以进行远程操作吗?

一个使用示例是我为用户提供一些routine.o文件,并让他们扩展它,类似

void routine::NeverBeforeDeclaredFunction() { ... }

这个确切的例子是不允许的,但有什么相似之处?我已经考虑过让这个类有一个函数指针数组,并让用户使用自己的函数填充该数组。但这并没有提供任何优势,例如访问私有变量或访问this

5 个答案:

答案 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)

答案,至少对于c ++,答案是否定的。标题的想法是完全捕获正在声明的对象/函数的整个接口。即使你可以这样做,也可能不是一个好习惯。

成员函数(非虚拟)都有一个隐含的“this”参数,允许它们访问父对象的成员,也许你可以使用具有显式“this”参数的函数指针。至于访问私有成员,您可以尝试将这些功能声明为朋友(不幸的是需要更改标题)。

答案 3 :(得分:0)

问题不在"编译" vs"未编译"语言,但严格键入"严格键入"并且"弱类型"语言。

对于严格类型化的面向对象语言,只有类的扩展才能引入新方法。这是#34;对象"的重点。但扩展对象还需要您可以控制对象的创建。

然而,偶尔会出现这样的需求 - 而且每种语言都会提供一些东西,这些东西可以看起来像是"扩展" (避免"扩展"因为这是此上下文中的OO术语)现有的东西。

例如,C ++使用流的方法重载,因此可以使其工作:

cout << var_of_some_non_standard_type;

在C#中你有扩展方法 - 在你自己的代码中你可以假装一个类有更多的方法。编译器将它们映射到静态方法。

在Java中,您还可以通过在自己的代码中使用函数的静态导入来假装一点点。

答案 4 :(得分:0)

这取决于扩展功能的含义。

通常,扩展功能转换为扩展类。因此,,您可以从类派生并添加更多功能,同时仍保留基类的类型。继承是is-a关系。

如果您指的是在不扩展或修改标题的情况下向现有类添加功能,那么不,这是不可能的。如果你问我,这是件好事。