我现在正在学习C ++,OO方面,而且我一直都在学习这个:
class SomeClass{
virtual void aMethod()=0;
}
class AnotherClass{
void anotherMethod(){/*Empty*/}
}
class SomeClassSon : public SomeClass{
void aMethod(){/*Also Empty*/}
}
我的疑问是:3种方法之间有什么区别。虚拟等于零,空虚,虚拟,因为它是遗留的,空的。
为什么我不能像父亲一样制作SomeClassSon方法?(虚拟空白等于零?)
答案 0 :(得分:11)
为了你的
class SomeClass{
virtual void aMethod()=0;
}
纯虚方法的存在使您的类抽象。一旦在类中有一个这样的纯虚方法=0
,就无法实例化该类。更重要的是,任何派生类都必须实现纯虚拟aMethod()
,否则它也会成为一个抽象类。
在派生类中,您从上面覆盖纯虚方法,这使得派生类不是抽象的。您可以实例化此派生类。
但是,在派生类中,方法的主体是空的,对吗?这就是为什么你的问题有道理的原因:为什么不让这个类纯粹是虚拟的。那么,你的班级可能需要其他方法。如果是这样,SomeClass
无法实例化(有一个纯虚方法),而子类SomeClassSon
可以。{/ p>
同样适用于AnotherClass
,可以实例化,与SomeClass
相反。
答案 1 :(得分:6)
区别在于virtual void aMethod() = 0
是pure virtual function,意思是:
SomeClass
成为一个抽象基类,
意思是它无法实例化。SomeClass
的类必须实现aMethod
,否则它也会成为无法实例化的抽象基类请注意,具有一个或多个纯虚函数的任何类都自动成为抽象基类。
答案 2 :(得分:4)
您所指的“等于0”称为“纯虚拟”。这是一个函数,希望实例化的子实现HAS而不是提供基本功能,这意味着父类将定义必须存在的功能,但父类不知道子进程将如何执行。请注意,这使得类抽象,因为它无法实例化。例如,我可能想要定义一个我可以继承的“哺乳动物”类,我希望它的孩子能够以某种方式行事 - 但我不能简单地制作一个“哺乳动物”。相反,我会创建一个“长颈鹿”类,并确保它的行为像它应该的那样。
此问题也解释了这个SO。
您所指的“空”函数是功能,其中定义了函数并且可以调用 - 但不执行任何操作。
答案 3 :(得分:2)
声明aMethod()= 0告诉编译器必须在子类中提供此方法。任何未实现该方法的子类都无法实例化。这有助于确保基类的任何对象都将实现该方法。
答案 4 :(得分:1)
纯virtual
使类抽象化。空的非虚方法不会执行任何操作 - 如果您尝试调用它,则只会导致链接器错误。相比之下,你不能尝试调用纯virtual
(除非你试图从构造函数中调用它,无论如何都是坏的),因为编译器不允许你创建该对象。
还有一个逻辑上的区别 - 标记为virtual
的方法将通过继承链实现虚拟 - 其他方法只是常规方法。
答案 5 :(得分:1)
一个纯虚函数(你的第一个例子,带有=0
)意味着必须在派生类中重写函数,才能实例化该类的对象。
第二个基本上只是一个什么都不做的成员函数。由于该函数具有不同的名称且该类与SomeClass
无关,因此这两者根本不会相互影响。
第三个覆盖了纯虚函数,因此可以实例化SomeClassSon
,但是在派生类中,被覆盖的函数什么都不做。