如何在C++中循环访问未知对象方法?



假设我有这个类

基类 { 公共: BaseClass((; ~基类((; void runAllMethods((; };

和子类

子类:公共基类 { 公共: 子类((; ~子类((; 任意方法 无效方法1((; 无效方法2((; ... };

假设我随后创建了对象

子类 myObject = 子类((;

如何在BaseClass中编写runAllMethods(),以便它可以运行自身的所有方法,包括SubClass中定义的方法(例如methods1()method2()等(?换句话说,如何在不知道子类方法名称的情况下让超类访问子类中的方法?

如何在C++中循环访问未知对象方法?

据我所知,这是不可能的。通过读取 n3337(C++11 标准(进行检查。

一种可能的方法是生成运行所有这些代码的C++代码。

你可以使用一些元编程方法(就像Qt使用它的moc一样,它生成C++代码(,或者你可以使用一些由构建自动化工具驱动的预处理器(例如GPP(。GNU autoconf 可能是鼓舞人心的。

如果您使用 GCC 编译C++代码,请考虑使用插件对其进行扩展。

您可以考虑一些 X 宏技巧。

如果您的操作系统有插件,您可以在运行时生成它们,然后加载它们。在 Linux 上,请参阅 dlopen(3( 和 dlsym(3( 和 C++ dlopen mini howto 和如何编写共享库

在某些操作系统上,您可以使用 JIT 编译技术在运行时生成机器代码,就像 GCC libgccjit 一样。或者使用 asmjit

请注意 C++11 中的 lambda 表达式。也许它们可能有用(除了其他方法(。

还可以考虑使用其他编程语言(例如Common Lisp;它是同象的,但C++不是(并使用聪明的实现(例如SBCL(。

考虑在你的C++程序中嵌入一些解释器,也许是Lua或Guile或Python。然后,解释脚本是程序的一些输入,并可能运行与其接口的任何代码。阅读龙书。

几乎通过使用virtual关键字。请参阅此示例:

#include <iostream>
using std::cout;
using std::endl;
class BaseClass {
public:
BaseClass() {}
virtual ~BaseClass() {}
void method1() { cout << "in superclass" << endl; }
virtual void runAllMethods()
{
method1();
}
};
class SubClass : public BaseClass {
public:
SubClass() {}
virtual ~SubClass() {}
void method2() { cout << "in subclass" << endl; }

virtual void runAllMethods()
{
BaseClass::runAllMethods();
method2();
}
};
int main()
{
BaseClass* obj = new SubClass;
obj->runAllMethods();
delete obj;
}

输出:

in superclass
in subclass

这会从子类调用runAllMethods方法,然后再次调用子类方法和超类runAllMethods.
如果您需要稍微不同的体系结构,最好是说明稍后使用它的代码应该是什么样子。

在行动:http://cpp.sh/2mvvy

编辑:如果你想要一些额外的安全性,请在子类中使用override

virtual void runAllMethods() override

如果该方法实际上没有重写,这会警告您(例如,如果您有一个参数,并且您在超类中更改了它的类型,但不在子类中更改了它的类型,从而导致方法具有不同的签名,因此不会覆盖。

最新更新