当两个都没有在基类中定义时,C ++中的虚函数和纯虚函数有什么区别?

时间:2016-03-12 11:22:59

标签: c++

这个问题没有重复,因为我添加了一个条件“当两个都没有在基类中定义时”。 如果在基类C中,我创建一个语句virtual void display();并且它从未在类C中定义,它是一个虚函数。我对吗?如果我做一个像“virtual void display()= 0;”的声明它是一个纯虚函数。 因此在这两种情况下,派生类必须定义显示函数。那么为什么我们需要纯虚函数呢?或者我的陈述中有什么问题?

2 个答案:

答案 0 :(得分:4)

  

因此,在这两种情况下,派生类必须定义显示函数

不正确的。只有派生类才能覆盖纯虚函数,以使派生类具体化。

  

那么为什么我们需要纯虚函数呢?

指定类型为abstract,以防止其实例化。

  

如果两个都没有在基类中定义,那么C ++中的虚函数和纯虚函数有什么区别?

正如我所提到的,纯虚函数是使类抽象的东西。

通过声明一个函数,你保证会有一个定义。如果没有定义,则该程序生成错误。纯虚函数是例外,因为它们不是必须定义它们(但你可以)。简而言之,没有定义的非纯虚拟是一个错误。

答案 1 :(得分:1)

"纯虚拟方法"只是方法的名称,在声明它的类中没有定义。您必须声明一个纯虚方法,以避免链接器错误。考虑这个简单的例子:

/* abstract classes */
struct Broken { virtual void foo(); };
struct Fixed  { virtual void foo()=0; };

/* implementations */
struct A : Broken { void foo(){} };
struct B : Fixed  { void foo(){} };

int main() {
    //Broken* a = new A(); delete a; // (*)
    Fixed* a = new B(); delete a;
    return 0;
} 

(*)创建链接器错误(即使创建的对象具有foo()定义)。要告诉编译器该方法是纯虚拟的,您必须放置=0;

  

[...]为什么必须在基类中定义非纯虚函数?

这就是它的定义方式。有一些东西:基类中没有定义的方法。我们给它起一个名字:纯虚方法。争论为什么纯虚拟在基类中没有定义或者是否允许非纯虚方法在基类中没有定义是没有意义的。