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

C++ Is it possible that the base class has a function with a parameter of the derived class

我主要想做以下事情:

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

class Derived : public Base{
     //Something
};

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

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

你最好这样做:

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
}

这意味着如果你真的想这样做,你的继承模型是没有意义的。记得"Make sure public inheritance models 'is a.' "http://debian.fmi.uni-sofia.bg/~mrpaff/Effective%20C++/EC/EI35_FR.HTM 如果你让他们有继承关系,那就意味着Derived是一个Base,而不是"Derived is part of Base"。 您可以创建 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.