如何访问派生类中定义的函数而不是多态中的基类?
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 );
}
任何人都可以帮我如何调用派生类函数,而这个函数没有在基类中指定吗?
答案 0 :(得分:2)
答案 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();
}