我想写如下内容:
class A {
virtual typedef int foo_t;
void bar() {
cout << "foo_t is " << get_demangled_name(typeid(foo_t));
}
}
class B : A {
typedef float foo_t;
}
并且为了bar()
表现出多态性。但是 - 这在 C++ 中是不可能的。我应该怎么做?
我想写如下内容:
class A {
virtual typedef int foo_t;
void bar() {
cout << "foo_t is " << get_demangled_name(typeid(foo_t));
}
}
class B : A {
typedef float foo_t;
}
并且为了bar()
表现出多态性。但是 - 这在 C++ 中是不可能的。我应该怎么做?
所以,如果这只是一个思想实验,那么答案就是“你不能那样做”。
如果您确实想要派生类具有不同类型的层次结构,则可以执行以下操作:
class Base
{
public:
virtual void bar() = 0;
};
class A: public Base
{
public:
void bar() { ... do stuff here }
private:
typedef int foo_t;
};
class B: public Base
{
public:
void bar() { ... do stuff here }
private:
typedef float foo_t;
};
或者,如果不需要继承:
template<typename T>
class TemplateA
{
typedef T foo_t;
void bar() { ... do stuff here ... }
}
typedef TemplateA<int> A;
typedef TemplateA<float> B;
虚函数给出的是你可以拥有:
vector<Base&> v;
A a;
B b;
v.push_back(a);
v.push_back(b);
并以通用方式使用它。模板并没有提供那么大的灵活性(在这个例子中,当然可以生成某种模板化的解决方案,它也有一个基类,然后这两个解决方案或多或少是相同的)
这完全取决于您的思想实验实际上要解决的问题 - 即使它只是一个思想实验,这两种解决方案也会有不同的优缺点,具体取决于您要如何使用它们。