我正在尝试进行一个项目,该项目要求我在运行时确定多态对象的类型,以便我可以对其进行转换。 我的意思的一个例子:
class A{
};
class B: public A{
public:
void foo(){
printf("B::foo()\n");
}
};
稍后,我将有一堆 B 对象,它们基本上是这样存储的:
std::vector<A*> v;
v.push_back(new B());
我将需要调用某些定义为的重载方法:
void bar(B* b){
b->foo();
}
传入存储在 v
中的对象后.我遇到的问题是在我的实际用例中,我不知道 B
的类型在编译时,所以我不能只调用 bar
通过说bar((B*)v.get(0));
我一直认为我可能需要的解决方案是以某种方式确定每个对象在运行时的类型,以便我可以在将其传递给 bar
之前对其进行转换。 .
到目前为止我尝试过的解决方案是使用 decltype
, 但它对我不起作用,因为它只返回传入值的静态类型,而不是运行时的类型。
另外,我不想为这个项目使用第三方库,因为我想让它尽可能小。
感谢您的帮助。
编辑:
我认为在描述我的问题时我的意思不够清楚。在我的实际用例中(尝试在此处发布有点长,但如有必要我可以发布其中的一部分),我正在尝试编写一个库,其中有一个基类(此处表示为 A
)可以由用户扩展到他们自己的自定义类(此处表示为 B
)。在我的示例中,B::foo()
只是应该代表 A
的每个子类可以有自己的数据成员,稍后由某种方法处理(在我的示例中表示为 bar
)。这也是A
的原因不能简单地拥有一些虚拟的 foo
方法。
我遇到的主要问题是,自 B
应该是用户定义的,我不知道它在编译时是什么,但我在链接时知道(因为链接稍后出现)。这就是为什么使用 dynamic_cast
(正如 Sam 和 Remy 所建议的那样)行不通,因为据我所知,它要求我知道 B
的所有可能性。可能是,我不知道。尽管它看起来确实非常接近对我有用的东西。如果有某种方法可以获得所有可能的子类(例如,使用预处理器宏或模板),那么我认为这可能会起作用。
我希望这次我解释得更好。再次感谢您的帮助。
编辑2:另一个澄清点:在我正在从事的实际项目中,我只希望用户被要求编写自己的B
。类和重载 bar
使用他们的自定义类。但是,我不希望要求用户调用 bar
.相反,我想要 bar
从基类(我定义的)调用。这就是我什至尝试按照我的方式这样做的主要原因。那,看看我是否可以。
希望一切都过去了。再次感谢。
最佳答案
这就是虚拟方法的用途。
声明 foo()
A
中的虚拟方法,而且您不必担心做丑陋的转换。
或者,如果 A
至少有一个虚函数——一个虚析构函数就可以了——你可以试试你的运气 dynamic_cast<>
.
关于C++ 在运行时确定多态对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449474/