-7

我想写如下内容:

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++ 中是不可能的。我应该怎么做?

4

1 回答 1

2

所以,如果这只是一个思想实验,那么答案就是“你不能那样做”。

如果您确实想要派生类具有不同类型的层次结构,则可以执行以下操作:

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);

并以通用方式使用它。模板并没有提供那么大的灵活性(在这个例子中,当然可以生成某种模板化的解决方案,它也有一个基类,然后这两个解决方案或多或少是相同的)

这完全取决于您的思想实验实际上要解决的问题 - 即使它只是一个思想实验,这两种解决方案也会有不同的优缺点,具体取决于您要如何使用它们。

于 2014-07-14T13:32:32.493 回答