【发布时间】:2012-02-02 22:45:15
【问题描述】:
我有一个基类B 和几个派生模板类D<int>、D<float>、D<double> 等(这么多)
在我的程序中,我发现有一个 B 指针,我知道该指针指向 D 特化之一的实例。我还有一个标识派生类型的唯一键。
所以,我想使用我的基类指针和唯一类型键调用正确的派生类方法。我实际上想在几个地方这样做,所以我想出的一个解决方案不仅丑陋,而且很麻烦。
在 C++ 中有没有更好的方法来访问具有基指针和唯一键的派生类成员?
我不想/不能修改基类。 boost库是公平的游戏。
这是我的潜在代码,但我不喜欢在需要访问派生成员函数/变量的任何地方复制它。所有这一切都是为了一个成员函数调用?!!
B * bptr = ...
std::type_info * typekey = ...
if (typekey == &typeid(D<float>) ) {
D<float> * dptr = static_cast<D<float>*>(bptr);
dptr->derivedMember();
} else if (typekey == &typeid(D<double>) ) {
D<float> * dptr = static_cast<D<double>*>(bptr);
dptr->derivedMember();
} else if (typekey == &typeid(D<int>) ) {
D<float> * dptr = static_cast<D<int>*>(bptr);
dptr->derivedMember();
}
【问题讨论】:
-
为什么不让
derivedMember()成为一个虚函数? -
+1 到@KerrekSB,同样如果 derivedMember 是 D 的成员函数(但不是 B),您可以在 D 和 B 之间引入一个基类 C,将 derivedMember 作为虚函数添加。
-
@KerrekSB 我看不出在这种情况下将派生成员设为虚拟会有什么帮助。它们不存在于基类中。我看到引入中间类可能是一种选择。考虑到现有的阶级关系,我想我真的希望有一些可行的方法,但我当然不会坚持下去。
标签: c++ casting rtti derived-types