C++中的虚函数

Zak*_*aks 3 c++ virtual-functions dynamic-binding

在下面的c ++代码中使用虚函数

#include<iostream>
using namespace std;
class Base{
    public:
    virtual void fun(){
        cout << "Base::fun()called \n";
    }

};

class Child : public Base {
    public:
    void fun() {
        cout << "Child::fun() called\n";
    }

    void door(){
        cout << "Child::door() called \n";
    }
};


int main(){

    Base *base_ptr = new Child();
    base_ptr->fun();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何使用base_ptr调用门功能?在一次采访中询问了这个问题.我想知道它是否可能

谢谢你的回复

Vit*_*meo 6

(假设Base并且Child无法修改.)

您可以使用static_cast转换base_ptrChild*.

static_cast<Child*>(base_ptr)->door()
Run Code Online (Sandbox Code Playgroud)

只要您确定base_ptr实际指向Child实例,这是安全的.


如果您不知道派生实例类型base_ptr指向的是什么,请考虑使用dynamic_cast:

if(auto child = dynamic_cast<Child*>(base_ptr))
{
    child->door();
}
Run Code Online (Sandbox Code Playgroud)

除非编译器设法积极地优化它,否则与dynamic_cast额外的运行时开销相比static_cast.

  • `dynamic_cast`可能更合适. (4认同)
  • @VittorioRomeo:你在答案中指出了自己的理由,因为`static_cast`是有效的,"你必须确保`base_ptr`实际上是指向'Child`实例".`dynamic_cast`允许您确定是否如此. (3认同)
  • @FredLarson是对的,`dynamic_cast`总是更好的选择,因为它在代码更改且原始假设不再有效时更能抵御错误.只有2种情况,首选`static_cast`:当基类中没有虚函数时,以及当你无法负担`dynamic_cast`的开销时,因为它处于紧密循环中(但你可能会这样做)在循环之外的dynamic_cast`). (2认同)