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();