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

时间:2014-06-20 11:45:28

标签: c++

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

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

}

任何人都可以帮我如何调用派生类函数,而这个函数没有在基类中指定吗?

4 个答案:

答案 0 :(得分:2)

您可以向下转发基本指针

看看Here,这包含了对如何做的非常好的解释

从链接中删除:

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

答案 1 :(得分:2)

像这样:

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

ptr将生成有效的Derived指针;否则,将生成NULL指针(注意if&#34;守卫&#34; goo()的调用。

一般来说,过度使用dynamic_cast并不是一个好主意:如果你需要做很多事情,那就指出了你的类层次结构设计中的一个潜在缺点。

答案 2 :(得分:1)

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

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

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

并使用my_ptr->goo()调用该方法。如果my_ptr评估为nullptr,那么ptr的类型不正确。在调用goo之前,您需要测试其他内容,否则您可以调用未定义的行为

但是,这是一种绕过多态的反模式。设置类结构要好得多,这样可以避免这种情况。

答案 3 :(得分:0)

解决方案(肮脏且不推荐)如下

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