我有这段代码:
struct Type{
const char* name;
// other stuff
};
template <class T>
class Base{
public:
// some other functions
static const Type *Get_Type(){
/* Get the STATIC type of the class and make a new Type object */
virtual const Type *My_Type();
};
编辑:
我想实现两个成员函数,Get_Type()和My_Type()。 每个派生类都继承自Base&lt; T&GT;继承像这个Base&lt;派生&gt;。
我无法访问任何Derived类,也无法更改Get_Type()和My_Type()的声明,但是其他所有内容都是允许的。
Get_Type() - 应该被实现为返回调用它的类的类型。
应该实现My_Type - 返回调用对象的动态类类型。
例如:
class Derived1: public Base<Derived1> {
public:
Derived1() {}
};
class Derived2 : public Derived1 , public Base<Derived2> {
public:
Derived2() {}
};
int main() {
Derived1* b= new Derived2();
Derived2::Get_Type(); // should return a struct Type with name=Derived2
b->My_Type(); // should return a struct Type with name=Derived2
return 0;
}
我的问题是:
1)如何在静态函数Get_Type的主体内部知道调用类的类型?
2)如何在My_Type()体内获得对象的动态类型(this
)?
答案 0 :(得分:1)
C ++中没有虚拟静态。你能得到的最接近的是:
这称为CRTP。
另一种选择 - 因为你只需要类型 - 将是一个特征模板类,它被声明为在之外的基础(即全局)。
答案 1 :(得分:0)
答案是从模板参数中获取类型。 Get_Type()的完整定义是:
template<class T>
const Type *Base<T>::Get_Type() {/* get T's name and construct a Type struct */}
从T你可以得到调用类的类型。
对于My_Type(),定义为:
virtual const Type *My_Type(){
return this->Get_Type();
}
由于c ++使用动态绑定,因此被调用的成员函数将是调用对象的动态类之一。