代码之家  ›  专栏  ›  技术社区  ›  Daniele E. Domenichelli

继承自已弃用的类

  •  4
  • Daniele E. Domenichelli  · 技术社区  · 9 年前

    我想使用C++98和g++编译器将一个类标记为不推荐使用,以便在直接使用该类或有人从该类派生时收到警告。

    显然,使用 __attribute__ ((__deprecated__)) 当使用类时有效,但不用于继承。

    例如:

    #if defined(__GNUC__)
    # define DEPRECATED __attribute__ ((__deprecated__))
    #else
    # define DEPRECATED
    #endif
    
    
    class DEPRECATED Foo
    {
    public:
        explicit Foo(int foo) : m_foo(foo) {}
        virtual ~Foo() {}
    
        virtual int get() { return m_foo; }
    
    private:
        int m_foo;
    };
    
    
    class Bar : public Foo // This declaration does not produce a compiler
                           // warning.
    {
    public:
        explicit Bar(int bar) : Foo(bar), m_bar(bar) {}
        virtual ~Bar() {}
    
        virtual int get() { return m_bar; }
    
    private:
        int m_bar;
    };
    
    int main(int argc, char *argv[])
    {
        Foo f(0); // This declaration produces a warning.
        Bar b(0); // This declaration does not produce a warning.
        return b.get();
    }
    

    我希望收到“class Bar:public Foo”的警告,但事实并非如此(用g++5.2.1测试)。

    当从已弃用的类派生时,是否有方法发出警告?

    1 回复  |  直到 9 年前
        1
  •  6
  •   Chris Beck    9 年前

    我认为解决这一问题的最简单方法是,不是实际上将该类标记为已弃用,而是为该类创建一个已被标记为已废弃的私有类,并将其实例化为其构造函数中的临时变量。因此,如果实例化派生类,仍然会收到弃用警告。

    class base {
      class DEPRECATED deprecator {};
    public:
      base() {
        deprecator issue_warning;
        (void) issue_warning; // this line is no-op to silence unused variable warning for local variable
      }
    };
    
    class derived : public base {
    public:
      derived()
        : base()
      {
        // I am also deprecated, because I called the ctor for base
        // which instantiates a deprecated class
      }
    };
    

    如果 base 有许多不同的构造函数,但这至少给出了一个想法。一般来说 derived 被构造 基础 必须构造--必须在 衍生的,衍生的 实例可以开始。