未实现的基类函数应该是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 function内Foo
,所以富是一个抽象类。换句话说,你不能实例化Foo
。大多数派生类需要提供虚函数的实现。
另一方面,第二个版本声明了一个虚函数(不是纯函数)并在类之外定义它。派生类可以通过覆盖函数来实现所需的行为。
注意:纯虚函数可以选择有一个正文。例如
class Foo {
virtual void unimplementedFunc() = 0;
};
void Foo::unimplementedFunc() {} //is valid
答
这取决于您的要求。派生类需要实现该方法本身还是可选的?允许直接实例化基类是否有意义?
如果需要实现,则让编译器通过使其成为纯虚拟方法来强制实施。
答
在上面的代码中,基类成为抽象类时= 0(即)基本:: foo的()一个纯虚函数(用 “= 0” 表示)。 *
一个类是抽象的,如果它包含至少一个纯虚函数在 。
不可以创建抽象类的实例,也不能将抽象类用作函数参数或返回类型。 抽象类指针和引用总是合法的。 通常,抽象类的使用与上述示例中一样,用作基础,并允许通过实际引用派生类型实例的指针或引用进行操作。
创建一个空函数的第二种方法并没有这样做。
因此,如果它是零,继承者*执行它? – jmasterx 2010-10-15 03:18:37
@Milo:是的。 http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.4 – jamesdlin 2010-10-15 03:20:08