在描述一个类时,如何知道函数何时必须是虚拟的?
我知道虚拟功能意味着什么,但我无法弄明白何时应该将它们变为虚拟
由于
答案 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;
这样你的基类就无法实例化了(你可能不希望它被实例化,因为它仍然没有未实现的方法)。
使用虚方法,您可以使用类多态来为您工作。
如果您知道某个方法的行为不会改变,那么请不要将其设置为虚拟(查找虚函数调用的时间比“最终”/非虚函数调用的时间长。)