【问题标题】:In C++ if a member function is virtual when can static binding be used?在 C++ 中,如果成员函数是虚拟的,什么时候可以使用静态绑定?
【发布时间】:2010-09-20 23:57:36
【问题描述】:

在 C++ 中,虚函数何时可以使用静态绑定?如果是通过指针访问,是直接访问,还是从不访问?

【问题讨论】:

    标签: c++ binding static


    【解决方案1】:

    只有当对象的类型在编译时完全明确时,才能进行静态绑定。我只能想到抽象对象的类型明确的四个地方:在构造函数中,在析构函数中,在本地声明时以及在与动态分配相同的范围内时。我不太了解标准,所以我不能说出它对这四种可能性的看法(我会说前两个是静态绑定的,第三个可能是静态绑定的,最后一个不是;虽然它可能说它是未定义的或实现依赖)。除了这些点之外,通过基类指针访问的对象可能指向派生类,并且当前翻译单元无法知道,因此不可能进行静态绑定。可以在一个实例中使用指向基类的指针和在另一个实例中使用指向派生类的指针来调用该函数!

    【讨论】:

    • 优化器可以通过内联融合不同的作用域。如果类型在这些范围之一中已知,则它将在融合范围中已知。
    【解决方案2】:

    如果要调用函数的基类版本,可以通过显式命名基类来实现:

    class Base
    {
    public:
      virtual ~Base() {}
      virtual void DoIt() { printf("In Base::DoIt()\n"); }
    };
    
    class Derived : public Base
    {
    public:
      virtual void DoIt() { printf("In Derived::DoIt()\n"); }
    };
    
    Base *basePtr = new Derived;
    basePtr->DoIt();  // Calls Derived::DoIt() through virtual function call
    basePtr->Base::DoIt();  // Explicitly calls Base::DoIt() using normal function call
    delete basePtr;

    【讨论】:

    • 哈,我正在输入几乎完全相同的帖子!为你点赞。
    【解决方案3】:

    当通过指针或引用调用虚方法时,使用动态绑定。任何其他时间,都会使用编译时绑定。例如:

    class C;
    
    void Foo(C* a, C& b, C c) {
      a->foo();  // dynamic
      b.foo();  // dynamic
      c.foo();  // static (compile-time)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 2010-12-21
      • 2015-06-03
      • 2013-07-27
      • 2010-09-07
      • 2011-10-21
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多