C ++与virtual = 0的区别;和空功能

时间:2013-02-25 20:11:14

标签: c++ oop class methods

我现在正在学习C ++,OO方面,而且我一直都在学习这个:

class SomeClass{
   virtual void aMethod()=0;
}

class AnotherClass{
   void anotherMethod(){/*Empty*/}
}

class SomeClassSon : public SomeClass{
   void aMethod(){/*Also Empty*/}
}

我的疑问是:3种方法之间有什么区别。虚拟等于零,空虚,虚拟,因为它是遗留的,空的。

为什么我不能像父亲一样制作SomeClassSon方法?(虚拟空白等于零?)

6 个答案:

答案 0 :(得分:11)

为了你的

class SomeClass{
   virtual void aMethod()=0;
}

纯虚方法的存在使您的类抽象。一旦在类中有一个这样的纯虚方法=0,就无法实例化该类。更重要的是,任何派生类都必须实现纯虚拟aMethod(),否则它也会成为一个抽象类。

在派生类中,您从上面覆盖纯虚方法,这使得派生类不是抽象的。您可以实例化此派生类。

但是,在派生类中,方法的主体是空的,对吗?这就是为什么你的问题有道理的原因:为什么不让这个类纯粹是虚拟的。那么,你的班级可能需要其他方法。如果是这样,SomeClass无法实例化(有一个纯虚方法),而子类SomeClassSon可以。{/ p>

同样适用于AnotherClass,可以实例化,与SomeClass相反。

答案 1 :(得分:6)

区别在于virtual void aMethod() = 0pure virtual function,意思是:

  1. SomeClass成为一个抽象基类, 意思是它无法实例化。
  2. 任何继承自SomeClass的类必须实现aMethod,否则它也会成为无法实例化的抽象基类
  3. 请注意,具有一个或多个纯虚函数的任何类都自动成为抽象基类。

答案 2 :(得分:4)

您所指的“等于0”称为“纯虚拟”。这是一个函数,希望实例化的子实现HAS而不是提供基本功能,这意味着父类将定义必须存在的功能,但父类不知道子进程将如何执行。请注意,这使得类抽象,因为它无法实例化。例如,我可能想要定义一个我可以继承的“哺乳动物”类,我希望它的孩子能够以某种方式行事 - 但我不能简单地制作一个“哺乳动物”。相反,我会创建一个“长颈鹿”类,并确保它的行为像它应该的那样。

此问题也解释了这个SO

您所指的“空”函数是功能,其中定义了函数并且可以调用 - 但不执行任何操作。

答案 3 :(得分:2)

声明aMethod()= 0告诉编译器必须在子类中提供此方法。任何未实现该方法的子类都无法实例化。这有助于确保基类的任何对象都将实现该方法。

答案 4 :(得分:1)

virtual使类抽象化。空的非虚方法不会执行任何操作 - 如果您尝试调用它,则只会导致链接器错误。相比之下,你不能尝试调用纯virtual(除非你试图从构造函数中调用它,无论如何都是坏的),因为编译器不允许你创建该对象。

还有一个逻辑上的区别 - 标记为virtual的方法将通过继承链实现虚拟 - 其他方法只是常规方法。

答案 5 :(得分:1)

一个纯虚函数(你的第一个例子,带有=0)意味着必须在派生类中重写函数,才能实例化该类的对象。

第二个基本上只是一个什么都不做的成员函数。由于该函数具有不同的名称且该类与SomeClass无关,因此这两者根本不会相互影响。

第三个覆盖了纯虚函数,因此可以实例化SomeClassSon,但是在派生类中,被覆盖的函数什么都不做。