1

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

请告诉我在这个 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;
}
4

2 回答 2

1

在 class 的setdptr函数中base,您还没有derived定义完整的类,所以编译器还不知道有哪些成员derived

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

像这样的东西:

class derived;

class base
{
    // ....

    void setdptr(derived* dptr);

    // ....
};

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

void base::setdptr(derived* dptr)
{
    m_dptr = dptr;
    dptr->sayHello();
}
于 2012-04-05T09:44:54.570 回答
1

有什么问题是

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

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

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

但是从基类调用派生方法是一种代码味道,您不需要这样做

于 2012-04-05T09:41:46.027 回答