【问题标题】:Does C++ derived class ever have to include definitions of inherited functions/members in header file?C++ 派生类是否必须在头文件中包含继承函数/成员的定义?
【发布时间】:2013-11-16 23:20:10
【问题描述】:

标题几乎说明了一切——派生类是否必须在头文件中重新包含从父类继承的函数/数据成员的定义?

继承的函数/成员可以从继承声明中隐含吗?是否应该明确地重新声明它们以提高可读性,或者这可能会隐藏风险?

我不确定我应该在派生类的头文件中做什么。

【问题讨论】:

    标签: c++ inheritance header polymorphism


    【解决方案1】:

    C++ 派生类是否必须在头文件中包含继承函数/成员的定义?

    从字面上理解:不 - 在 C++ 中,any 非模板函数的 定义 - 无论继承或类成员身份 - 都不需要出现在标题中。类仅定义静态数据成员 - 在它们的实现文件中根据单一定义规则 - 并且基类定义不需要也不能在任何派生类中重复。

    也就是说,我想你一定在想函数声明,其中:

    • 需要为非虚拟函数重复,尽管您可能需要using 语句来公开隐藏的基类函数
    • 必须在派生类重写基类的 virtual 函数定义/实现时在派生类定义中重复(对于协变返回类型允许的变化非常有限,并且能够更改默认参数 - 但不要这样做!)。

    例如:

    struct Base { virtual void f() = 0; };
    
    struct Derived : Base { virtual void f(); };                // must mention f() here...
    
    // then either in same header as Derived (and `inline` per One Definition Rule) or
    // out-of-line in an implementation file...
    
    ?inline? void Derived::f() { std::cout << "Hello world\n"; }  // ...to define it here
    

    如果你没有在struct Derived { } 中提及f(),编译器会假设你会:

    • 使用基类定义/实现(如果有/以上示例有= 0 用于纯虚函数,因此没有可用的)),或
    • 稍后在派生更多的类/结构中指定一个实现(如果它是纯虚拟的,那么此类将保持抽象,您无法创建此类类型的对象)。

    继承声明中可以隐含继承的函数/成员吗?是否应该为了可读性而明确地重新声明它们,或者这可能会隐藏风险?

    对于几乎所有情况,我上面所说的都涵盖了这一点(即,您只需重新声明您将为其提供新定义的函数);例外情况是基类中的纯虚函数,并且在派生类中将保持纯虚函数...如果您认为它具有某些文档价值,您可以选择声明它们 - 这根本没有区别。

    我不确定我应该在派生类的头文件中做什么。

    通常你只想指定:

    • 其他功能和成员,
    • using 声明您希望公开的任何隐藏函数
    • virtual 您将为其提供新定义的函数,无论是在派生类的标头中内联还是在其实现文件中外联

    您无需重复数据成员定义。

    【讨论】:

      【解决方案2】:

      C++ 派生类是否必须包含继承的定义? 头文件中的函数/成员?

      您需要通过头文件指定父(基)类声明。继承的函数不需要重新声明。

      继承的函数/成员可以从继承中隐含吗 声明?

      如果我正确理解您的问题,是的,它们是隐含的,因为它们不需要再次明确指定。

      是否应该明确地重新声明它们以提高可读性

      由于您继承的是类而不是函数,因此不需要重新声明函数。此外,重新声明可能并不总能提高可读性(它也会使文件变得混乱)。

      或者这种风险可以隐藏吗?

      Information Hiding 或抽象不会受到影响,只要 access modifiers 不更改。

      【讨论】:

        【解决方案3】:

        你不应该重新声明,因为这会保证隐藏。

        继承是基础知识,因此阅读您代码的其他人会记得检查基类以查找他们找不到的任何成员声明。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多