如何在多态中访问定义在派生类而不是基类中的函数

How to access the function which is defined in derived class and not in base class in polymorphism

本文关键字:基类 函数 派生 多态 访问 定义      更新时间:2023-10-16

如何访问在派生类中定义的函数,而不是在多态性的基类中定义的函数?

class base {
    public:
        virtual void display ()
        {
            cout << "base" << endl;
        }
};
class derived : public base {
    public:
        void display (){
            cout << "Derived" << endl;
        }
        void goo (){
            cout << " new function in derived" << endl;
        }
};
base * global_function ( base *ptr)
{
    /**** how to invoke the derived class goo function  ---Here *****/

}
int main ()
{
    derived obj;
    global_function ( &obj );
}

谁能帮助我如何调用派生类函数,这是没有在基类中指定?

像这样:

Derived *d = dynamic_cast<Derived*>(ptr);
if (d) d->goo();
如果ptr确实指向Derived

dynamic_cast<Derived*>将产生一个有效的Derived*指针;否则,将产生NULL指针(注意if"保护"goo()的调用)。

一般来说,过度使用dynamic_cast不是一个好主意:如果你需要经常使用它,它指出了你的类层次结构设计中的一个潜在缺陷。

可以向下转换基指针

看这里,这包含了一个很好的解释做什么

摘自链接:

Child *p = dynamic_cast<Child *>(pParent);

您可以访问该方法,但您必须希望 base *ptr实际上是derived*类型(在您的情况下,它是)。

然后可以使用dynamic_cast将指针转换为正确的类型:

derived* my_ptr = dynamic_cast<derived*>(ptr)

并使用my_ptr->goo()调用该方法。如果my_ptr的计算结果是nullptr,那么ptr不是正确的类型。您需要在调用goo之前测试这个else,否则您可以调用未定义行为

但是,这是一个绕过多态性的反模式。最好设置您的类结构,这样可以避免这种强制转换。

解决方案(不干净,不推荐)如下

base* global_function ( base *ptr ) {
    std::dynamic_cast<Derived>(*ptr).goo();
}

虽然这在这种特殊情况下可能有效,但不要假设基类型指针包含关于foo的信息,而应该进行模板专门化并维护类型安全!

template <typename T>
T* global_function(const T* ptr) {
    // do nothing in this case. 
}
// Specialization
template<>
base* global_function<base>(const base* ptr) {
    // invoke base methods
}
template<>
Derived* global_function<Derived>(const Derived* ptr) {
    ptr->goo();
}