在向上转换派生类的指针后,仍然调用派生类的虚拟方法,这在我看来是错误的,因为切片应该发生。
您能评论一下这段代码有什么问题吗?
class Base
{
public:
virtual void Hello() { cout << "Hello Base" << endl; }
};
class Derived: public Base
{
public:
void Hello() { cout << "Hello Derived" << endl; }
};
int main()
{
Derived* der = new Derived;
Base* base = dynamic_cast<Base*> (der);
if (base) base->Hello();
}
输出:Hello 派生
切片没有发生,因为您没有使用任何值Base
,只是指向它的指针。
这会导致切片:
Base base = *der;
但如果你想调用一个函数并抑制动态调度,你可以这样做:
base->Base::Hello();
要调用的函数是静态指定的。这适用于der
当然,也避免了中间人。
Your dynamic_cast
这里不需要。您可以隐式向上转型,因为这在编译时是可以简单验证的。您可以使用static_cast
沮丧,但要由你来确保这实际上是正确的;dynamic_cast
只是一个经过检查的版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)