虚函数中协变返回类型的作用是什么?为何要设为虚函数?
协变返回类型为何要搭配虚函数
你给出的协变返回类型示例很具代表性:
class Base { public: virtual Base& get() { return *this; } }; class Derived : public Base { public: Derived& get() override { return *this; } };
你困惑的点在于“调用点的返回类型是静态定义的”,但这只覆盖了直接用子类对象调用方法的场景。协变返回类型搭配虚函数的核心意义,其实是为了支持基类指针/引用触发的多态调用:
举个实际场景:
Base* ptr = new Derived(); // 如果get是虚函数,这里实际调用的是Derived::get() Derived& ref = ptr->get(); // 合法!协变返回规则允许直接转换,无需手动强转 ref.derived_only_method(); // 直接调用子类独有的方法如果把
get改成非虚函数,那ptr->get()只会调用Base::get(),返回Base&。此时要调用子类方法,必须手动做static_cast<Derived&>(ptr->get())——不仅麻烦,还会在实际对象不是Derived时触发未定义行为。
说白了,虚函数+协变返回类型的组合,是让多态场景下的返回值类型能“跟着实际对象走”,既保留了基类接口的通用性,又能在确定实际类型时安全地使用子类的特性,避免了冗余且危险的类型转换。
内容的提问来源于stack exchange,提问作者Kaiyakha
相关产品推荐
相关产品推荐

