【问题标题】:Is it possible to call derived class functions from Base class是否可以从基类调用派生类函数
【发布时间】:2012-04-05 09:39:10
【问题描述】:

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

请告诉我这个场景中我的代码有什么问题

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

【问题讨论】:

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

标签: c++ inheritance constructor virtual-functions


【解决方案1】:

base 类的setdptr 函数中,您还没有定义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();
}

【讨论】:

    【解决方案2】:

    有什么不好的

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-21
      • 2011-06-19
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 2014-01-01
      相关资源
      最近更新 更多