为什么在向上转换之后调用派生类的虚方法?

2024-02-08

在向上转换派生类的指针后,仍然调用派生类的虚拟方法,这在我看来是错误的,因为切片应该发生。 您能评论一下这段代码有什么问题吗?

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(使用前将#替换为@)

为什么在向上转换之后调用派生类的虚方法? 的相关文章

随机推荐