如何知道函数何时必须是虚拟的?

时间:2011-03-14 09:28:28

标签: c++ class virtual-functions

在描述一个类时,如何知道函数何时必须是虚拟的?

我知道虚拟功能意味着什么,但我无法弄明白何时应该将它们变为虚拟

由于

7 个答案:

答案 0 :(得分:3)

如果要调用函数polymorphically,函数应该是虚拟的。换句话说,虚函数表达可以在子类中定制的行为。例如,请考虑以下类:

class Car {
public:
    const std::string & getId() const;
    virtual void startEngine() = 0;
private:
    std::string id;
}

每辆车都有Id,这里不允许自定义,所以没有必要让它变成虚拟。子类不应该能够修改该属性。然而,引擎如何启动取决于具体的汽车,实际上不能全局定义。但我们知道每辆车都必须在我们开车前启动发动机,因此我们将其定义为纯虚拟功能。

何时将函数设为虚拟的重要指南,何时不是Non-Virtual Interface成语。

答案 1 :(得分:1)

您的类是否具有虚函数取决于该类是否将用作基类,这取决于设计和体系结构。

答案 2 :(得分:1)

这取决于派生类是否可能具有基类中存在的成员函数的不同功能。采用多边形类的设计 -

class Polygon
{
    public:
    virtual float area();
    virtual ~Polygon(){};  // Since Polygon is a polymorphic class, it destructor needs to be virtual.
};

成员函数Polygon::area()需要是虚拟的。为什么?因为所有多边形的面积计算都不相同。

class Rectangle : public Polygon
{
    public:
    float area()
    {
         // area = 2* (length+breadth) ;
    }
};

同样 -

class Square : public Polygon
{
    public:
    float area()
    {
         // area = side*side;
    }
};

请注意,Square,Rectangle是一种Polygon,但两者的面积计算并不相同。在这种设计情况下,成员函数可能在派生类中有不同的实现,它需要在基类中 virtual

答案 3 :(得分:1)

如果要通过指针或对基类的引用来使用对象,则需要使函数成为虚拟函数。然后,您可以调用派生类的函数,而无需确切知道它是什么类型。

如果单独使用每个类,并且知道每个对象的类型,即使使用派生类,也不需要虚函数。

答案 4 :(得分:0)

如果希望将类视为其他类的基类,并且您认为类中有一些函数可能会覆盖派生类,那么很好地表明您应该创建这些函数{{1 }}。使它们virtual启用运行时多态性!这意味着,您可以多态地使用这些类,即使用类型基类的指针/引用,但指向派生类对象!

简而言之,在基于接口的类设计中,应该创建函数virtual

永远记住一件事:在设计多态类时,一定不要忘记创建基类析构函数virtual

答案 5 :(得分:0)

在软件设计方面,如果您尝试定义和抽象类或接口,您将使用虚拟关键字来强制执行动态多态。

答案 6 :(得分:0)

当您知道方法的行为可能会或将要在继承自该类的类中发生更改时,您应该使该方法成为虚拟方法。更准确地说,如果您希望子类覆盖该方法,则将其设为虚拟。如果您不想在基类中实现该方法,那么将其设为纯虚拟: 即:

virtual void f() = 0;

这样你的基类就无法实例化了(你可能不希望它被实例化,因为它仍然没有未实现的方法)。

使用虚方法,您可以使用类多态来为您工作。

如果您知道某个方法的行为不会改变,那么请不要将其设置为虚拟(查找虚函数调用的时间比“最终”/非虚函数调用的时间长。)