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

时间:2012-04-05 09:39:10

标签: c++ inheritance constructor virtual-functions

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

请告诉我,我的代码中有什么错误

#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;
}

2 个答案:

答案 0 :(得分:1)

那是什么问题

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

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

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

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

答案 1 :(得分:1)

在类setdptr的{​​{1}}函数中,您还没有定义base类,因此编译器还不知道{{1}中的成员是什么}。

derived的实际定义移至derived声明之后,它应该有效。

这样的事情:

setdptr