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

时间:2010-10-15 03:15:43

标签: c++

以下哪项是更好的做法?

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

或者

     class Foo {
        virtual void unimplementedFunc();
        };

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

由于

4 个答案:

答案 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,则它是抽象的   至少一个纯虚函数。

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

创建空函数的第二种方法不会这样做。

参考:http://www.glenmccl.com/tip_033.htm