假设我有这个类
类基类 { 公共: 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
如果该方法实际上没有重写,这会警告您(例如,如果您有一个参数,并且您在超类中更改了它的类型,但不在子类中更改了它的类型,从而导致方法具有不同的签名,因此不会覆盖。