首页 > 试题广场 >

虚函数可不可以重载为内联?

[单选题]
虚函数可不可以重载为内联?
  • 可以
  • 不可以
  • 语法错误

Occasionally...

When the object is referenced via a pointer or a reference, a call to a virtual function cannot be inlined, since the call must be resolved dynamically. Reason: the compiler can't know which actual code to call until run-time (i.e., dynamically), since the code may be from a derived class that was created after the caller was compiled.

Therefore the only time an inline virtual call can be inlined is when the compiler knows the "exact class" of the object which is the target of the virtual function call. This can happen only when the compiler has an actual object rather than a pointer or reference to an object. I.e., either with a local object, a global/static object, or a fully contained object inside a composite.

发表于 2014-10-25 00:26:04 回复(0)
更多回答
虚函数不可以内联,因为虚函数是在运行期的时候确定具体调用的函数,内联是在编译期的时候进行代码展开,两者冲突,所以没有一起使用的做法。
编辑于 2017-06-28 22:46:06 回复(4)

内联只是对编译器的一种请求,是否真正内联要看编译器的处理,虚函数是可以内联的,但是编译器不会响应内联请求,即他会忽略内联说明,将其当做普通虚函数处理。

class A
{
public:
    virtual inline int f()
    {
        cout<<"..a"<<endl;
    }
};

class B :  public A
{
public:
    int f(){cout<<"..b"<<endl;}
};

int main()
{

    A* b = new B();
    b->f();
    int c = 4;
}

得到输出:

..b

发表于 2017-06-19 15:10:58 回复(0)
A

虚函数是可以内联的,但是编译器在处理的时候还是按照函数编译的,内联实际上是不起作用的因为虚函数是要为多态提供基础的,如果按照内联函数展开后就无法实现多态了。
可以内联的情况:
1.“虚函数静态调用”: pclass->class::vf()
2.用一个类对象通过成员选择符.调用虚函数,如
obj.vf()
3.虚析构函数的静态调用链一定会被内联展开

编辑于 2015-11-15 08:13:56 回复(5)
内联函数不能为虚函数,因为内联函数是直接将代码拷贝过去,不存在地址这一说法,而虚函数使用过程中需要一个虚地址
http://www.cnblogs.com/kex1n/archive/2010/01/15/1648380.html
发表于 2016-07-16 07:59:11 回复(0)
虚函数是可以内联的。当内联和多态一起时,编译器遵循的第一个规则是:多态性必须起作用,实际上编译器总是忽略内联需求,使用虚函数表,唯一绝对需求是代码必须工作,也就是说虚函数有多态行为,通常,无论是显示还是隐士内联,它只是一个提示而已,并非是必须的,至于你们说的两者运行时间不一样,但是当这二者结合时,多态为大,CSDN 上有大神解释了。
发表于 2017-01-01 21:45:15 回复(1)
虚函数不可以内联,因为虚函数是在运行期的时候确定具体调用的函数,内联是在编译期的时候进行代码展开,两者冲突,所以没有一起使用的做法。 内联函数不能为虚函数,因为内联函数是直接将代码拷贝过去,不存在地址这一说法,而虚函数使用过程中需要一个虚地址 http://www.cnblogs.com/kex1n/archive/2010/01/15/1648380.html
编辑于 2018-11-29 11:19:49 回复(0)

虚函数是通过虚函数表来实现动态绑定的,而内联函数在编译时会将函数体直接插入到调用处,这两者的机制是相互冲突的。

虚函数的内联化可以通过编译器的优化来实现。编译器可以根据上下文和函数的大小等因素,决定是否将虚函数内联化

发表于 2023-09-18 12:15:35 回复(0)
多态运行时作用,到内联函数编译时作用,这就导致内联的虚函数展开后,不是子类的重写函数,无法实现多态特性
发表于 2022-06-30 10:00:22 回复(0)
内联函数不能为虚函数,原因在于虚表机制需要一个真正的函数地址,而内联函数展开以后,就不是一个函数,而是一段简单的代码(多数C++对象模型使用虚表实现多态,对此标准提供支持),可能有些内联函数会无法内联展开,而编译成为函数。
发表于 2016-01-21 15:43:15 回复(1)
可以内联 但是编译器采不采纳是他的问题 不信去cppreference看看
发表于 2022-03-31 19:51:49 回复(0)
inline是编译器的行为,虚函数可以用inline修饰
发表于 2016-08-03 21:54:05 回复(0)
虚函数到底能不能作为内联函数,求大神解答。
发表于 2016-05-23 16:36:01 回复(5)

虚函数可以重载为内联。虚函数和内联函数是两个不同的概念,它们可以单独使用,也可以结合使用。

虚函数(virtual function)主要用于实现多态性,允许派生类重写基类中的函数。当使用基类的指针或引用调用一个虚函数时,会根据实际对象的类型来决定调用哪个版本的函数。

内联函数(inline function)则是一种优化手段,用于减少函数调用的开销。内联函数会在编译时将其代码直接插入到调用点,从而避免函数调用的开销。但需要注意的是,内联函数的定义对编译器来说只是一个建议,编译器可以选择忽略这个建议,不将函数内联。

因此,虚函数可以声明为内联的,但这并不意味着它一定会被内联。内联函数的声明只是一个建议,而虚函数的调用则涉及到运行时多态性。即使虚函数被声明为内联,当通过基类指针或引用调用虚函数时,多态性的行为仍然会保留,即调用的是派生类的版本。

所以正确答案是:

A 可以

编辑于 2024-04-06 11:46:41 回复(0)
虚函数是在运行的时候确定的口地址,而内联函数是在编译的时候确定的,二者时间冲突了
发表于 2023-10-19 14:32:18 回复(0)
虚函数可以内联,纯虚函数不能
发表于 2023-10-01 23:30:07 回复(0)
虚函数可以被声明为内联函数,但它们通常不会被内联。

内联函数是在编译时展开的函数,它的代码会被直接插入到调用它的地方,而不是通过函数调用的方式执行。这样可以减少函数调用的开销,提高程序的执行效率。然而,虚函数在运行时多态性的特性要求通过虚函数表来进行动态绑定,因此虚函数的调用通常不能在编译时确定。

虚函数可以被声明为内联函数,但这只是给编译器一个建议,而非强制性要求。编译器可以选择忽略内联函数的建议,将虚函数视为普通的函数调用,以确保正确的动态绑定。

因此,尽管虚函数可以被声明为内联函数,但通常不会被内联。编译器更倾向于在运行时进行动态绑定,以保持虚函数的多态性。
发表于 2023-07-09 08:33:48 回复(0)
看到很多大佬们都认为不可以,但是我想问:当子类继承时,采用参数列表的形式来定义构造函数,这是内联的一种吧?这是明却写在C++primer Plus 里面的呀,是可以的呀。有指点的吗?
发表于 2023-05-08 11:53:18 回复(1)
虚函数不可以内联,因为虚函数是在运行期的时候确定具体调用的函数,内联是在编译期的时候进行代码展开,两者冲突,所以没有一起使用的做法。
发表于 2022-12-01 18:23:42 回复(0)
虚函数可以内联
发表于 2022-07-22 16:27:12 回复(0)