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.
我主要想做以下事情:
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.