C++ 是否可以从基类调用派生类函数

C++ 是否可以从基类调用派生类函数,c++,inheritance,constructor,virtual-functions,C++,Inheritance,Constructor,Virtual Functions,我需要澄清调用方法,我有一个基类,我试图从中使用派生类对象调用派生类函数。可能吗 请告诉我在这个senario中我的代码有什么错误 #include "stdafx.h" #include <malloc.h> class derived; class base { public: base() { } ~base() { } void setdptr(derived* dptr) { m_dpt

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

请告诉我在这个senario中我的代码有什么错误

#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;
}
#包括“stdafx.h”
#包括
类派生;
阶级基础
{
公众:
base()
{
}
~base()
{
}
无效设置dptr(派生*dptr)
{
m_dptr=dptr;
dptr->sayHello();
}
虚拟void addfunc()
{
printf(“基类添加”);
}
导出*m_dptr;
};
派生类:公共基
{
公众:
派生的()
{
}
~派生()
{
}
void addfunc()
{
printf(“衍生类添加”);
}
void sayHello()
{
printf(“打招呼”);
}
void setDeriveToBase()
{
setdptr(本);
}
};
int _tmain(int argc,_TCHAR*argv[]
{
衍生dp;
dp.setDeriveToBase();
返回0;
}
怎么了

void setdptr(derived* dptr)
{
    m_dptr = dptr;
    dptr->sayHello();
}
这是违法的。您只提供了一个到
派生的
的前向声明,因此不能使用其中的任何方法,因为编译器除了知道类的存在之外,对该类一无所知

您需要将声明与实现分开,在
cpp
文件中移动实现,并在该文件中包含定义
派生的
的头


但是从基类调用派生方法是一种代码气味,您不需要在类
base
中的
setdptr
函数中执行该操作,您还没有完整定义
派生的
类,因此编译器还不知道
派生的
中有哪些成员

setdptr
的实际定义移动到
derived
声明之后,它应该可以工作

大概是这样的:

class derived;

class base
{
    // ....

    void setdptr(derived* dptr);

    // ....
};

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

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

是否可以从基类调用派生类函数???