【问题标题】:Proper header file syntax正确的头文件语法
【发布时间】:2011-12-30 17:54:10
【问题描述】:

我试图了解从父类继承方法时何时需要在头文件中声明函数。

例如,假设我有以下课程:

class parent{
public:
    virtual void foo()= 0;
}

假设我有一个从父类继承的子类,我是否还必须在子类的头文件中声明 foo 或者我可以简单地在源文件中为子类定义方法?

下面的声明会不正确吗?

头文件:

class child : public parent{
}

类文件:

child::foo(){
// do something
}

【问题讨论】:

  • foo 应声明为virtual。除此之外,如果您要覆盖 foo(您几乎必须这样做,因为它是纯虚拟的),那么您需要在子类中将其声明为类定义的一部分。
  • foo() 也应该声明为public,否则继承自parent 的类无法访问它。
  • C++ 实际上允许私有虚函数(甚至允许你覆盖它们)。通常是让派生类指定基类期望的一些功能,而不让它成为接口的一部分。

标签: c++ inheritance


【解决方案1】:

来自基类的非虚方法在子类中继承,因此您不需要在子类中再次定义或声明它们,在派生类对象上调用的非虚方法将简单地调用在基类中定义的方法(提供的访问说明符规则允许您)

如果您在派生类中再次从基类声明一个方法,那么它会在派生类中声明一个新方法,该方法隐藏所有具有相同名称的基类方法。这称为功能隐藏

好读:

What's the meaning of, Warning: Derived::f(char) hides Base::f(double)?

如果是虚拟方法,您不需要在子类中再次声明基类方法,您只需要提供一个定义。这称为函数覆盖

【讨论】:

    【解决方案2】:

    您不必在子类定义或其标题中声明foo()。它是自动继承的——这就是继承的意思。 (当然,函数必须是 public 而不是基类 (parent) 中的 private,但这是小错误。)

    您只需在源文件中为子类定义方法。

    【讨论】:

    • 这不是真的。他将无法实例化child,除非他将其声明为非纯虚拟。
    • g++ 失败:error: no ‘void child::foo()’ member function declared in class ‘child’
    【解决方案3】:

    头文件:

    class Class : public Parent {
    
    public:
        void myMethod();
    }
    

    源文件:

    void Class::myMethod(){
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2010-11-15
      • 2014-05-21
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      相关资源
      最近更新 更多