在继承中实现虚函数

时间:2015-06-28 12:33:11

标签: c++ inheritance operator-keyword

我有一个练习处理c ++中的类,我在其中创建了一个类似的文件系统(File.h

class File {
   public:
   virtual string getName();
   virtual void print() const=0;
   virtual bool operator==(const File& file) const=0;
}

然后,我在getName中实施File.cpp并创建TextFile.h

class TextFile : public File {
   public:
   void print() const;
   void operator==(const TextFile& textFile) const;

   private:
   string text_;

TextFile.cpp

中实施
void TextFile :: print() const {
   cout << text_ << endl;
}

bool TextFile :: operator==(const TextFile& textFile) const {
   return true; //just for compiling
}

编译时我们得到:

$ g++ -Wall -g File.cpp TextFile.cpp -o  RunMe
TextFile.cpp: In function ‘int main()’:
TextFile.cpp:8:11: error: cannot declare variable ‘Ilan’ to be of abstract type ‘TextFile’
  TextFile Ilan("Ilan", NULL, "Blah \n NewLine");
           ^
In file included from TextFile.cpp:1:0:
TextFile.h:8:7: note:   because the following virtual functions are pure within ‘TextFile’:
 class TextFile: public File
       ^
In file included from TextFile.h:4:0,
                 from TextFile.cpp:1:
File.h:57:18: note:     virtual bool File::operator==(const File&) const
     virtual bool operator==(const File& file) const = 0;

我可能不知道如何很好地使用继承和操作符函数(看到print函数运行良好),但在查看我的课程资料时我无法找到问题。

4 个答案:

答案 0 :(得分:1)

OVERLOAD vs. OVERRIDE ...

File中声明虚函数

bool operator==(const File & file) const
纯粹的。 (= 0)。所以File是一个抽象类,它的子类也没有被覆盖。

TextFile中,您使用具有相同名称(operator==)的函数重载

bool operator==(const TextFile & textFile) const 

但你不能覆盖它,因为参数类型不同。因此TextFile是一个抽象类,因为

bool TextFile::operator==(const File & file) const

仍未定义。

编辑:如果您使用C ++ 11关键字&#34;覆盖&#34;,编译器可以检测到此类问题。在TextFile.h

class TextFile :  public File 
{
   ...
   void print()            const override;
   bool operator== (.....) const override; 
   ...
 }

一条消息将告诉我们这些功能是否实际上不会覆盖它们。

答案 1 :(得分:1)

编译器告诉你它不能声明Ilan是“Textfile”类型,因为“虚函数是纯粹的”,然后给你纯虚函数的名称。

在C ++中,纯虚函数是一个已声明为虚函数的函数,并且没有定义任何实现。如果某个类具有任何纯虚拟函数,则它是一个虚拟类,并且您无法创建该类的实例。这对于创建抽象接口非常有用,这是您对父类所做的。

在您的情况下,您已指定==运算符是TextFile声明中的类运算符,但您已在全局命名空间中定义了==运算符。要纠正这个问题,您可以在全局命名空间中声明 ==运算符,或者将其定义为TextFile的一部分(如Ed Heal建议的那样),但您应该更喜欢前者,原因如下所述: Operator overloading : member function vs. non-member function?

答案 2 :(得分:0)

该行

bool operator==(const &TextFile textFile) const {

不正确 - 应该是

  bool TextFile::operator==(const TextFile& textFile) const {

因为需要定义。

答案 3 :(得分:0)

File.h

1.8.2

TextFile.h

class File {
   public:
   virtual string getName() const=0;
   virtual void print() const=0;
};

TextFile.cpp

class TextFile : public File {
   public:
   string getName() const;
   void print() const;
   bool operator==(const TextFile& textFile) const;

   private:
   string text_;
};