未实现的基类函数应该是0吗?

问题描述:

以下哪一项更好?未实现的基类函数应该是0吗?

class Foo { 
virtual void unimplementedFunc() = 0; 
}; 

或者

 class Foo { 
     virtual void unimplementedFunc(); 
     }; 

//in cpp 
void Foo::unimplementedFunc() 
{ 
    //not implemented in base 
} 

感谢

class Foo { 
virtual void unimplementedFunc() = 0; 
}; 

你有一个pure virtual functionFoo,所以富是一个抽象类。换句话说,你不能实例化Foo。大多数派生类需要提供虚函数的实现。

另一方面,第二个版本声明了一个虚函数(不是纯函数)并在类之外定义它。派生类可以通过覆盖函数来实现所需的行为。

注意:纯虚函数可以选择有一个正文。例如

class Foo { 
    virtual void unimplementedFunc() = 0; 
    }; 

void Foo::unimplementedFunc() {} //is valid 

有两个除了它是未实现之间的差异。通过将其设置为零,您已将第一个Foo类设为abstract class。创建空函数的第二种方法并没有这样做。

+0

因此,如果它是零,继承者*执行它? – jmasterx 2010-10-15 03:18:37

+0

@Milo:是的。 http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.4 – jamesdlin 2010-10-15 03:20:08

这取决于您的要求。派生类需要实现该方法本身还是可选的?允许直接实例化基类是否有意义?

如果需要实现,则让编译器通过使其成为纯虚拟方法来强制实施。

在上面的代码中,基类成为抽象类时= 0(即)基本:: foo的()一个纯虚函数(用 “= 0” 表示)。 *

一个类是抽象的,如果它包含至少一个纯虚函数在 。

不可以创建抽象类的实例,也不能将抽象类用作函数参数或返回类型。 抽象类指针和引用总是合法的。 通常,抽象类的使用与上述示例中一样,用作基础,并允许通过实际引用派生类型实例的指针或引用进行操作。

创建一个空函数的第二种方法并没有这样做。

Ref:http://www.glenmccl.com/tip_033.htm