在以下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() calledn";
}
void door(){
cout << "Child::door() called n";
}
};
int main(){
Base *base_ptr = new Child();
base_ptr->fun();
return 0;
}
如何使用base_ptr调用门功能?这个问题是在接受采访中提出的。我想知道是否可能
感谢您的答复
(假设无法修改Base
和Child
。)
您可以使用static_cast
将base_ptr
转换为Child*
。
static_cast<Child*>(base_ptr)->door()
只要您是 sure ,base_ptr
实际上指向Child
实例。
如果您不知道派生的实例类型base_ptr
指向什么,请考虑使用dynamic_cast
:
if(auto child = dynamic_cast<Child*>(base_ptr))
{
child->door();
}
除非编译器设法优化它,否则dynamic_cast
与static_cast
相比具有额外的运行时开销。
因为Base
没有door()
方法,您显然不能简单地调用base_ptr->door()
。
但是,如果您知道base_ptr
是Child
,则可以施放它,然后致电door()
Child* child_ptr = static_cast<Child*>(base_ptr);
child_ptr->door();