2010-07-26 204 views
2

可能重复:
Why pure virtual function is initialized by 0?设置虚拟函数声明为零?

在C++中,这是什么意思设定函数声明为零?我猜测它与函数是虚拟的,而不是在这个类中实际定义。发现在我正在阅读的代码的头文件中:

virtual void SetValue(double val)=0; 

这是怎么回事?

+2

打开你最喜欢的C++书并阅读纯虚函数。通过在论坛上提出一般问题来学习该语言的基础知识并不是一件有意义的事情。一些信息可以在这里找到http://en.wikipedia.org/wiki/Virtual_function – AnT 2010-07-26 22:00:01

+0

@Troubadour:FWIW:这个问题是从一个“这甚至是什么意思”的角度,而这个问题是“给出这个意思,为什么它看起来这样“ – Cogwheel 2010-07-26 22:04:53

+0

@AndreyT在我的辩护中,语法太神秘了,我不知道要查找纯虚函数(我已经明白了)。我想说,在论坛上提出这个通用问题对我来说非常有意义。 – ack 2010-07-26 22:30:26

回答

8

这是一个pure virtual function。它使得它必须派生一个类(并实现上述功能)才能使用它。

+0

除了派生类,您还必须在派生类中实现它们。 – bits 2010-07-26 22:01:28

+0

这导致抽象类。 – 2010-07-26 22:18:48

0

这意味着,class是抽象的,并且不能被创建它的对象。它可以用作另一个基地class
纯虚拟类也用于c++作为从java等语言已知的interface,但当然它是不同的。

0

如果你设置了一个虚拟函数来设置,它被称为纯虚函数。然后你的班级变成了抽象班。 除非您的纯虚函数被实现,否则您不能创建该类或任何子类的实例。

1

这意味着它是一个纯虚拟方法 - 这意味着子类必须自己实现该方法。该方法仍然可以有一个实现,但具有纯虚拟方法的类不能实例化,使得它类似于以其他各种语言显示的abstract关键字。

+1

尽管名称是一个纯虚拟方法可以有一个实现...纯虚拟声明意味着该类是抽象的,并且派生类必须实现该函数是非抽象的。这并不意味着该方法在基类中没有实现(实际上它可以在基类中有一个实现)。 – 6502 2010-07-26 22:14:03

+0

啊,当然。我的错。我将编辑我的帖子。 – 2010-07-26 22:21:15

+0

Nit pick:C++有函数,而不是方法。正确的术语是*纯虚函数*。 – 2010-07-26 23:53:23

2

这被称为纯C++语言中的虚拟成员函数。就像你猜测的那样,它意味着函数没有在类中定义,而是必须在派生类中实现。您不能使用纯虚拟成员函数实例化类,纯虚函数的行为基本上像Java或C#中的抽象方法。

+0

这并不意味着它没有被定义,只是它必须被覆盖。它可以有一个定义。 – 2010-07-26 22:32:49

+0

是的,你是对的。 – haffax 2010-07-26 23:21:57

0

方法SetValue是纯虚拟的。它的类不提供该方法的实现,也不能实例化(因此我们称它为抽象)。另一方面,具体派生类必须为这些方法提供实现。查看更多here

0

正如大家所提到的,这意味着函数是一个纯虚函数。把它看作设置函数指针为null。具有纯虚函数的类作为抽象类来处理。这意味着派生类必须实现这个虚函数。

偶尔,您可能会遇到所谓的“纯粹呼叫”错误。这意味着一个纯粹的虚拟函数实际上被调用,它很可能会导致程序崩溃。纯调用的最常见原因是该函数被调用的对象已被删除。

0

“SetValue”是基类强制派生类提供的纯虚拟成员函数。纯虚拟成员函数将没有实现。

纯虚拟成员函数指定成员函数将存在于具体派生类的每个对象上,即使成员函数没有(通常)在基类中定义。

这是因为指定纯虚拟成员函数的语法强制派生类实现成员函数,如果派生类打算实例化(即如果它们打算具体)。

在你的情况中,从基类派生的类的所有对象都有成员函数SetValue()。但是,因为基类是一个抽象概念,所以它不包含足够的信息来实现SetValue()。

想象一下,“= 0”就像是说“该函数的代码位于空指针。”

纯虚拟成员函数允许用户针对具有几个功能不同变体的接口编写代码。这意味着如果这些对象都在相同的抽象基类的保护下,那么可以将语义上不同的对象传递给函数。