【发布时间】:2011-08-29 21:53:45
【问题描述】:
我想看看是否可以创建“接口”,继承它们,然后在运行时检查是否有任何随机类实现了该接口。这就是我所拥有的:
struct GameObject {
int x,y;
std::string name;
virtual void blah() { };
};
struct Airholder {
int oxygen;
int nitrogen;
};
struct Turf : public GameObject, public Airholder {
Turf() : GameObject() {
name = "Turf";
}
void blah() { };
};
void remove_air(GameObject* o) {
Airholder* a = dynamic_cast<Airholder*>(o);
if(!a) return;
a->oxygen = 0;
a->nitrogen = 0;
};
现在,它可以工作了。文档说它有效,测试示例有效。但是,直到我向 GameObject 添加了一个虚拟方法,它才编译。问题是,我真的不知道该功能是否打算像那样使用。让我感到奇怪的是,我必须为正在检查的类声明一个虚函数。但很明显,没有,我检查的类本身没有虚函数,实际上我的整个代码都与虚函数无关,这是一种完全不同的方法。
所以,我想我的问题是:如果我正在做的事情真的有效,为什么我需要一个虚函数来为我的班级提供一个 vtable?为什么我不能将类声明为“运行时类型”或没有虚函数的东西?
【问题讨论】:
-
我知道这对你来说可能更像是一个学习练习,但你可以创建一个只有纯虚函数的界面并从那里开始。
-
哪个文档说它可以在没有虚拟功能的情况下工作?如果你连编译都不会,你为什么说这个测试例子可以工作?
-
@keith.layne:即使 Airholder 有虚拟功能,我仍然无法执行检查。我认为您没有理解问题所在。
-
@cib 我认为我明白。我的观点是,这是一个复杂的解决方案。我对 dynamic_cast 和 RTTI 以及所有这些东西了解一些,但一直远离它,因为它似乎不是解决我的问题的最佳方法。也许我被你的例子比你真正正在研究的简单得多。我的真正观点是,比起任何运行时的东西,我更喜欢静态类型检查和多态性。
标签: c++ polymorphism multiple-inheritance