为了账号安全,请及时绑定邮箱和手机立即绑定

内联虚拟功能真的没有意义吗?

/ 猿问

内联虚拟功能真的没有意义吗?

C
慕雪6442864 2019-11-14 14:10:31

内联虚拟功能真的没有意义吗?

当我收到代码评论评论说虚拟功能不需要内联时,我收到了这个问题。

我认为在直接在对象上调用函数的场景中,内联虚函数可以派上用场。但是我想到的反驳论点是 - 为什么要想定义虚拟然后使用对象来调用方法呢?

最好不要使用内联虚拟功能,因为它们几乎从未扩展过吗?

我用于分析的代码片段:

class Temp{public:

    virtual ~Temp()
    {
    }
    virtual void myVirtualFunction() const
    {
        cout<<"Temp::myVirtualFunction"<<endl;
    }};class TempDerived : public Temp{public:

    void myVirtualFunction() const
    {
        cout<<"TempDerived::myVirtualFunction"<<endl;
    }};int main(void) {
    TempDerived aDerivedObj;
    //Compiler thinks it's safe to expand the virtual functions
    aDerivedObj.myVirtualFunction();

    //type of object Temp points to is always known;
    //does compiler still expand virtual functions?
    //I doubt compiler would be this much intelligent!
    Temp* pTemp = &aDerivedObj;
    pTemp->myVirtualFunction();

    return 0;}


查看完整描述

3 回答

?
DIEA

有时可以内联虚函数。优秀的C ++ faq的摘录:

“内联虚拟调用唯一可以内联的是编译器知道作为虚函数调用目标的对象的”确切类“。这只有在编译器具有实际对象而不是指针时才会发生。引用一个对象。即,使用本地对象,全局/静态对象或复合内部的完全包含的对象。“



查看完整回答
反对 回复 2019-11-16
?
慕森卡


C ++ 11已添加final。这改变了接受的答案:不再需要知道对象的确切类,只需知道对象至少具有声明final的函数的类类型即可:

class A { 
  virtual void foo();};class B : public A {
  inline virtual void foo() final { } };class C : public B{};void bar(B const& b) {
  A const& a = b; // Allowed, every B is an A.
  a.foo(); // Call to B::foo() can be inlined, even if b is actually a class C.}



查看完整回答
反对 回复 2019-11-16
?
繁华开满天机

有一类虚拟功能,让它们内联仍然是有意义的。考虑以下情况:

class Base {public:
  inline virtual ~Base () { }};class Derived1 : public Base {
  inline virtual ~Derived1 () { } // Implicitly calls Base::~Base ();};class Derived2 : public Derived1 {
  inline virtual ~Derived2 () { } // Implicitly calls Derived1::~Derived1 ();};void foo (Base * base) {
  delete base;             // Virtual call}

删除'base'的调用将执行虚拟调用以调用正确的派生类析构函数,此调用不会内联。但是因为每个析构函数都调用它的父析构函数(在这些情况下为空),编译器可以内联这些调用,因为它们不会虚拟地调用基类函数。

基类构造函数或任何函数集也存在相同的原则,其中派生实现也调用基类实现。



查看完整回答
反对 回复 2019-11-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信