【问题标题】:How do I achieve the equivalent of type shadowing by a derived class?如何通过派生类实现等效的类型阴影?
【发布时间】:2014-09-04 10:01:33
【问题描述】:

我想写如下内容:

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

【问题讨论】:

  • 你为什么要那个?
  • 似乎是一个 XY 问题,您认为这是某个问题的解决方案,您最好描述原始问题。 [很可能你要么想要一个模板类,要么想要两个具有不同虚函数的类,但如果你描述你要解决的实际问题,可能还有其他更好的选择]
  • @Jarod42:Gedankenexperiment。我正在努力加深我的 C++ 知识。
  • @MatsPetersson:我没有说它是任何事情的“解决方案”......
  • @einpoklum:这不是刻薄,而是试图通过了解您的问题来回答您提出的问题,而不是回答您不想要的东西。当然,如果这个问题类似于“如果月亮是用奶酪做的,它尝起来是什么味道”,那么答案很可能是“没人知道,因为月亮不是用奶酪做的”。

标签: c++ inheritance types polymorphism shadowing


【解决方案1】:

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

如果你真的想要一个派生类有不同类型的层次结构,你可以这样做:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多