我想定义为具有静态方法的类X:
class X
{
static string get_type () {return "X";}
//other virtual methods
}我想强制从X继承的类重新定义get_type()方法,并返回与"X“不同的字符串(如果它们现在只是重新定义get_type,我很高兴)。
我该怎么做呢?我知道我不能有虚拟的静态方法。
编辑:问题不是关于type_id,而是关于应该被重写的静态方法。例如
class X {
static int getid() {return 1;}
}发布于 2010-05-15 05:44:03
您提到了一些关于保证子类型为您的函数产生唯一值的地方。正如其他人所说,如果不使用模板,这至少在编译时是不可能的,这可能是可接受的,也可能是不可接受的。但是如果你把它推迟到运行时,你也许可以做一些类似的事情。
class Base {
static std::vector<std::pair<const std::type_info*, int> > datas;
typedef std::vector<std::pair<const std::type_info*, int> >::iterator iterator;
public:
virtual ~Base() { }
int Data() const {
const std::type_info& info = typeid(*this);
for(iterator i = datas.begin(); i != datas.end(); ++i)
if(*(i->first) == info) return i->second;
throw "Unregistered Type";
}
static bool RegisterClass(const Base& p, int data) {
const std::type_info& info = typeid(p);
for(iterator i = datas.begin(); i != datas.end(); ++i) {
if(i->second == data) {
if(*(i->first) != info) throw "Duplicate Data";
return true;
}
if(*(i->first) == info) throw "Reregistering";
}
datas.push_back(std::make_pair(&info, data));
return true;
}
};
std::vector<std::pair<const std::type_info*, int> > Base::datas;
class Derived : public Base { };
const DerivedRegisterFlag = Base::RegisterClass(Derived(), 10);
class OtherDerived : public Base { };
const OtherDerivedRegisterFlag = Base::RegisterClass(OtherDerived(), 10); //exception注意:这是完全未经测试的。如果你这样做,异常会在进入main之前抛出。您可以将注册转移到构造函数中,如果您愿意,可以接受每个实例的注册检查开销。
为了简单起见,我选择了一个无序向量;我不确定type_info::before是否提供了用作映射谓词的必要语义,而且您可能不会有太多的派生类,以至于线性搜索无论如何都不会有问题。我存储了一个指针,因为你不能直接复制type_info对象。这在很大程度上是安全的,因为typeid返回的对象的生命周期就是整个程序。当程序关闭时可能会有问题,我不确定。
我没有试图防止初始化错误的静态顺序。正如所写的那样,这将在某个时候失败。
最后,不,它不是静态的,但是“静态”和“虚拟”在一起没有任何意义。如果没有该类型的实例可供操作,那么如何知道选择哪个重写的方法呢?在使用模板的一些情况下,您可能会合法地希望在没有实际对象的情况下调用静态方法,但这种情况并不常见。
*edit:另外,我不确定这是如何与动态链接库等交互的。我怀疑RTTI在这些情况下是不可靠的,所以很明显这也是不可靠的。
https://stackoverflow.com/questions/2836818
复制相似问题