C++ 从抽象类(C+;+;)派生类

C++ 从抽象类(C+;+;)派生类,c++,abstract-class,overriding,pure-virtual,C++,Abstract Class,Overriding,Pure Virtual,我有一个带有纯虚函数f()的抽象类,我想创建一个从该类继承的类,并重写函数f()。我将头文件和cpp文件分开。 我在头文件中声明了函数f(int),定义在cpp文件中。然而,编译器说派生类仍然是抽象的。 如何修复它?您是在基类中将f(int)声明为纯虚拟还是f() 纯虚函数可以在其基类中定义。纯虚函数只是说派生类型还必须指定自己的函数f(int)实现 函数f()和f(int)没有相同的签名,因此第二个函数不会为第一个函数提供实现。PVF的签名和实现必须完全匹配。 < P>使用C++模板的情况如何

我有一个带有纯虚函数f()的抽象类,我想创建一个从该类继承的类,并重写函数f()。我将头文件和cpp文件分开。 我在头文件中声明了函数f(int),定义在cpp文件中。然而,编译器说派生类仍然是抽象的。 如何修复它?

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

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


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

< P>使用C++模板的情况如何?

template<typename T>
 class Basic{
  public:
   void f(T);
};

template<typename T>
 Basic<T>::f(T t){
   //Do something generic here
 }
模板
基本类{
公众:
空隙f(T);
};
模板
基本::f(T){
//在这里做些普通的事情
}
如果函数f的参数为特定类型时需要执行其他操作,则可以使用模板专门化。在这个例子中,我将使用string

template<>
 class Basic<string>{
  public:
   void f(string);
};

template<>
 Basic<string>::f(string t){
   //Do your special thing with a string
}
模板
基本类{
公众:
空f(字符串);
};
模板
基本::f(字符串t){
//用绳子做你特别的事
}

希望这有帮助

我想在派生类中声明void f(int),它在基类中被声明为virtual void f()=0。你的问题是,你的基类中需要f(int)=0。嗯……但是我想派生几个类,并想在不同的类中使用不同的形式,如f(string)、f(int)等。因此,我认为唯一的解决方案是更改函数名。@cemregoksu:f(string),f(int)是完全不同的函数。例如,您可以要求实现f(),但没有通用的方式来表示要求实现f(任何内容)。这不被视为覆盖吗?@cemregoksu不,它们是不同的函数。C++中函数的“实名”是它的表名加上函数类型的所有类型,加上函数的常态,都是以某种方式编码的。@它们具有相同的名称,但签名不同,因此它们具有不同的功能。
template<>
 class Basic<string>{
  public:
   void f(string);
};

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