【问题标题】:Deriving a class from an abstract class (C++)从抽象类派生类 (C++)
【发布时间】:2011-02-01 14:48:27
【问题描述】:

我有一个带有纯虚函数 f() 的抽象类,我想创建一个从该类继承的类,并覆盖函数 f()。我分离了头文件和cpp文件。 我在头文件中声明了函数 f(int),定义在 cpp 文件中。但是,编译器说派生类仍然是抽象的。 我该如何解决?

【问题讨论】:

    标签: c++ abstract-class overriding pure-virtual


    【解决方案1】:

    函数 f() 和 f(int) 没有相同的签名,因此第二个不会为第一个提供实现。 PVF 的签名和实现必须完全匹配。

    【讨论】:

    • 不认为是覆盖吗?
    • @cemregoksu 不,它们是不同的功能。 C++ 中函数的“真实名称”是其表面名称加上函数参数的所有类型,加上函数的常量,所有这些都以某种方式编码。
    • @cemregoksu:不,它们是不同的函数 f() 和 f(int)。它们具有相同的名称但不同的签名,因此它们是不同的功能。
    【解决方案2】:

    您是在基类中将 f(int) 声明为纯虚函数还是 f()?

    纯虚函数可以在其基类中定义。纯虚函数只是说派生类型还必须指定它们自己的函数 f(int) 的实现。

    class Base
    {
    public:
      virtual void f(int) = 0;
    }
    
    
    Base::f(int)
    {
    //some code 
    }
    
    
    class Derived : public Base
    {
    public:
      virtual void f(int)
      {//Implementation is needed in Derived since f(int) is pure virtual
      }
    }
    

    【讨论】:

    • 我想在派生类中声明void f(int),在基类中声明为virtual void f()=0
    • 你的问题是你的基类中需要有 f(int)=0 。
    • hmm...但是我想派生几个类并希望在不同的类中使用不同的形式,例如 f(string)、f(int) 等。所以我认为唯一的解决方案是更改函数名称。
    • @cemregoksu: f(string), f(int) 是完全不同的函数。例如,您可以要求实现 f(),但没有通用的方式可以说要求实现 f(anything)。
    【解决方案3】:

    使用 C++ 模板怎么样?

    template<typename T>
     class Basic{
      public:
       void f(T);
    };
    
    template<typename T>
     Basic<T>::f(T t){
       //Do something generic here
     }
    

    如果您的函数 f 在其参数是特定类型时需要执行其他操作,您可以使用模板特化。在这个例子中我将使用字符串。

    template<>
     class Basic<string>{
      public:
       void f(string);
    };
    
    template<>
     Basic<string>::f(string t){
       //Do your special thing with a string
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2013-11-30
      • 2012-04-22
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多