C ++基类是否可能具有带派生类参数的函数

时间:2015-04-13 08:17:21

标签: c++ include instance base derived

我想基本上做以下几点:

class Base{
     void dosomestuff(Derived instanceOfDerived)
     {
         //Something
     }
};

class Derived : public Base{
     //Something
};

Base需要包含Derived,但要声明Derived它需要首先声明Base。前向声明不起作用,因为我不想使用指针。

现在我的问题是:如何在没有指针的情况下实现这一目标?这甚至可能吗?或者是使instanceOfDerived成为指针的唯一可能性吗?

3 个答案:

答案 0 :(得分:3)

你最好做点什么:

class Derived;
class Base{
     void dosomestuff(Derived& instanceOfDerived)
     {
         //Something
     }
};

class Derived : public Base{
     //Something
};

我甚至会将方法dosomestuff的主体移动到源cpp代码,您可以在其中包含derived.h和base.h

base.h看起来像:

#ifndef BASE_H_
#define BASE_H_

class Derived;
class Base{
     void dosomestuff(const Derived& instanceOfDerived);
};

#endif

derived.h:

#ifndef DERIVED_H_
#define DERIVED_H_

#include "base.h"

class Derived : public Base{
     //Something
};

#endif

base.cpp:

#include "base.h"
#include "derived.h"

void Base::dosomestuff(const Derived &instanceOfDerived) {
    //Something
}

答案 1 :(得分:2)

该问题的原始版本询问是否Base暂停Derived作为数据成员。这显然是不可能的。它是同样的无限递归问题(Derived包含一个Base子对象,因此Base会递归地包含它自己,并且它将一直是乌龟。)

修订后的问题询问Base的成员函数是否采用类型Derived的按值参数。这完全有可能。您需要Derived的前向声明,并推迟成员函数的定义,直到实际定义Derived之后:

class Derived;
class Base{
     void dosomestuff(Derived instanceOfDerived); // declaration only
};

class Derived : public Base{
     //Something
};

// out-of-class definition, so making it explicitly inline
// to match the in-class definition semantics
inline void Base::dosomestuff(Derived instanceOfDerived) {
     //Something
}

Demo

答案 2 :(得分:0)

这意味着如果你真的想这样做,你的继承模型是没有意义的。记住"确保公共继承模型是一个。' " http://debian.fmi.uni-sofia.bg/~mrpaff/Effective%20C++/EC/EI35_FR.HTM 如果你使它们具有继承关系,那意味着Derived是一个Base,而不是" Derived是Base"的一部分。 您可以创建2个类来执行此操作,而不是使它们具有继承关系。