2012-04-05 103 views
1

我需要澄清调用方法,我有一个基类,并从中尝试使用派生类对象调用派生类函数。是否有可能是否有可能从基类调用派生类函数

请告诉我什么是错在我的代码在此塞纳里奥

#include "stdafx.h" 
#include <malloc.h> 

class derived; 

class base 
{ 
public: 
    base() 
    { 

    } 
    ~base() 
    { 
    } 

    void setdptr(derived* dptr) 
    { 
     m_dptr = dptr; 
     dptr->sayHello(); 
    } 

    virtual void addfunc() 
    { 

     printf("base class add"); 
    } 

    derived *m_dptr; 

}; 

class derived : public base 
{ 
public: 
    derived() 
    { 
    } 
    ~derived() 
    { 
    } 

    void addfunc() 
    { 
     printf("derived class add"); 
    } 

    void sayHello() 
    { 
      printf("Say Hello"); 
    } 

    void setDeriveToBase() 
    { 
     setdptr(this); 
    } 

}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    derived dp; 
    dp.setDeriveToBase(); 
    return 0; 
} 
+0

什么是你的问题? – orlp 2012-04-05 09:41:26

+0

是否可以从基类中调用派生类函数? – Naruto 2012-04-05 09:42:48

回答

1

在函数base类中,您没有derived类定义了fulle,因此编译器还不知道derived中的成员是什么。

将的实际定义移到derived的声明之后,它应该起作用。

事情是这样的:

class derived; 

class base 
{ 
    // .... 

    void setdptr(derived* dptr); 

    // .... 
}; 

class derived : public base 
{ 
    // .... 
}; 

void base::setdptr(derived* dptr) 
{ 
    m_dptr = dptr; 
    dptr->sayHello(); 
} 
+0

感谢Joachim Pileborg ... – Naruto 2012-04-05 10:22:34

1

什么是错的是

void setdptr(derived* dptr) 
{ 
    m_dptr = dptr; 
    dptr->sayHello(); 
} 

是非法的。您只向derived提供了一个前向声明,所以您不能使用它的任何方法,因为除了它存在以外,编译器对这个类一无所知。

您需要将实现与声明分开,将执行文件移动到cpp文件中,并在该文件中包含定义derived的标头。

但是从基类调用派生方法是一种代码味道,你不应该这样做