【问题标题】:C++ Is it possible that the base class has a function with a parameter of the derived classC++基类是否有可能有一个带有派生类参数的函数
【发布时间】:2015-04-13 08:17:21
【问题描述】:

我基本上想做以下事情:

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

class Derived : public Base{
     //Something
};

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

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

【问题讨论】:

  • 对不起。你是完全正确的。我改了例子,问题还是一样的。
  • 如果您想引用尚未定义的内容,您需要某种间接方式,例如指针或引用。 (请注意,您不能在基类的定义中使用派生类,只能通过名称引用它;您需要移动函数定义。)

标签: c++ include instance base derived


【解决方案1】:

问题的原始版本询问让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】:

你最好这样做:

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

派生的.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
}

【讨论】:

  • 如果他们不想参考怎么办?
  • @JosephMansfield Derived 的接口无法从 Base 以简单的方式访问...
  • 所以我需要使用指针还是引用?没有别的办法了吗?
  • 唉,没有。
  • @WojciechFrohmberg,由于原始函数按值获取其参数,因此您的修复应该采用 const 引用。还有_BASE__DERIVED_reserved names,所以这个答案有未定义的行为。坏坏坏。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多