以下哪项是更好的做法?
class Foo {
virtual void unimplementedFunc() = 0;
};
或者
class Foo {
virtual void unimplementedFunc();
};
//in cpp
void Foo::unimplementedFunc()
{
//not implemented in base
}
由于
答案 0 :(得分:3)
这取决于您的要求。是自己实现方法所需的派生类还是可选的?允许直接实例化基类是否有意义?
如果需要实现,那么让编译器通过使其成为纯虚方法来强制执行它。
答案 1 :(得分:1)
除了未实现之外,两者之间存在差异。通过将其设置为零,您已将第一个Foo
类设为abstract class。创建空函数的第二种方法不会这样做。
答案 2 :(得分:1)
class Foo {
virtual void unimplementedFunc() = 0;
};
Foo
内有pure virtual function,因此Foo是一个抽象类。换句话说,您无法实例化Foo
。大多数派生类都需要提供虚函数的实现。
另一方面,第二个版本声明了一个虚函数(不纯)并在类外定义它。派生类可以覆盖该函数以实现所需的行为。
注意:纯虚函数可以选择具有正文。例如
class Foo {
virtual void unimplementedFunc() = 0;
};
void Foo::unimplementedFunc() {} //is valid
答案 3 :(得分:1)
在上面的代码中,当= 0(即)Base :: foo()是一个纯虚函数(用“= 0”表示)时,Base类成为抽象类。 *
如果一个类包含at,则它是抽象的 至少一个纯虚函数。
不能创建抽象类的实例,抽象类也不能用作函数参数或返回类型。 抽象类指针和引用总是合法的。 通常,抽象类的使用与上面的示例一样,用作基础并允许通过实际引用派生类型实例的指针或引用进行操作。
创建空函数的第二种方法不会这样做。