C+中的虚函数+; 在下面的C++代码中使用虚函数< /p> #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; } #包括 使用名称空间std; 阶级基础{ 公众: 虚拟虚空乐趣(){ cout

C+中的虚函数+; 在下面的C++代码中使用虚函数< /p> #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; } #包括 使用名称空间std; 阶级基础{ 公众: 虚拟虚空乐趣(){ cout,c++,virtual-functions,dynamic-binding,C++,Virtual Functions,Dynamic Binding,(假设不能修改Base和Child) 您可以使用static\u cast将base\u ptr转换为Child* static_cast<Child*>(base_ptr)->door() 除非编译器能够积极地优化它,dynamic\u cast比static\u cast有额外的运行时开销,因为Base没有door()方法,显然不能简单地调用Base\u ptr->door() 但是,如果您知道base\u ptr是子对象,则可以将其强制转换,然后调用door() Chi

(假设不能修改
Base
Child

您可以使用
static\u cast
base\u ptr
转换为
Child*

static_cast<Child*>(base_ptr)->door()

除非编译器能够积极地优化它,
dynamic\u cast
static\u cast
有额外的运行时开销,因为
Base
没有
door()
方法,显然不能简单地调用
Base\u ptr->door()

但是,如果您知道
base\u ptr
子对象
,则可以将其强制转换,然后调用
door()

Child*Child\u ptr=static\u cast(base\u ptr);
child_ptr->door();

添加
虚拟空门()=0;
对你来说是
Base的类声明。
或者你不能修改Base吗?@drescherjm。不,你不能修改Base你知道,当你看到OOP和类被错误地使用时,也许这只是一个小问题,看看你是如何反应的。
dynamic\u cast
可能更合适。@fredrarson:没有理由使用
dynamic\u cast
在这种特殊情况下。@VittorioRomeo:你在回答中指出了原因,为了使
static\u cast
有效,“你必须确保
base\u ptr
实际上指向一个
子实例”.
dynamic\u cast
允许您确定是否是这样。@BenVoigt:这对于问题中出现的情况总是正确的。无论如何,我更新了答案,使其更一般。@Fredrarson是对的,
dynamic\u cast
总是更好的选择,因为当代码为c时,它更能抵抗错误更改和原始假设不再有效。只有两种情况下会首选
静态\u cast
:基类中没有虚拟函数,以及由于处于一个紧密的循环中,您负担不起
动态\u cast
的开销(但您可能可以在循环之外执行
动态\u cast
)。
if(auto child = dynamic_cast<Child*>(base_ptr))
{
    child->door();
}
Child* child_ptr = static_cast<Child*>(base_ptr);
child_ptr->door();