在C++中,virtual 函数可以被声明为 inline,但是它们的行为会有所不同。
虚函数(virtual 函数)的主要特性是它们可以在派生类中被重写(覆盖)。这样,通过基类对象的指针或引用,可以在运行时决定调用的是基类还是派生类中的函数。为了实现这种动态的函数调用,C++ 使用了虚函数表(vtable)。
将 virtual 函数声明为 inline 会强制在每个使用点上进行内联展开,这意味着每次调用虚函数时,实际上会展开并执行相应的函数体。这与虚函数的预期行为相悖,因为虚函数应该在运行时根据对象的类型进行调用,而不是在每个调用点展开。
由于虚函数的调用是动态决定的,编译器在编译时不能确定具体调用哪个函数,因此无法进行内联展开。将 virtual 函数声明为 inline 可能会被编译器忽略,并仍然使用虚函数的正常行为,即使用虚函数表进行动态调度。
总结:
virtual函数是为了实现动态多态性,根据对象的实际类型在运行时进行动态调用。将其声明为inline会破坏此特性。- 编译器可能会忽略
virtual函数的inline声明,并继续使用虚函数表进行动态调度。 - 如果希望函数在调用点上被内联展开,可以将函数声明为非虚函数(非
virtual),并使用inline声明。这样,编译器可以在编译时进行内联展开。