我有一个练习处理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
函数运行良好),但在查看我的课程资料时我无法找到问题。
答案 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_;
};