【发布时间】:2013-09-16 03:53:51
【问题描述】:
我可以有一个基类,其成员是派生类的实例吗?我应该如何前向声明或包含派生类定义?还是我应该这样做的另一种方式?
// base.h
class DerivedClass; // Is forward declaration sufficient?
class Base {
public:
virtual ~Base();
virtual void DoStuff() = 0;
void DoSomethingWithD() {
d_.Foo();
}
protected:
DerivedClass d_;
};
// derived.h
#include "base.h"
class Derived : public Base {
public:
Derived();
void DoStuff();
void Foo();
private:
Derived(const Derived&);
void operator=(const Derived&);
};
// other_derived.h
#include "base.h"
class OtherDerived : public Base {
public:
OtherDerived();
void DoStuff();
private:
OtherDerived(const OtherDerived&);
void operator=(const OtherDerived&);
};
【问题讨论】:
-
您可以使用 CRTP en.wikipedia.org/wiki/Curiously_recurring_template_pattern 并将派生类的实例作为基类中的指针来实现此目的。
-
不,你不能。即使使用 CRTP。
Base的大小取决于Derived的大小,这取决于Base的大小。但是,您可以存储派生类的指针或引用。 -
@DyP 啊。我不需要会员。我可以得到一个指针。所以,那么前向声明就足够了。谢谢。
-
@Dyp 你错过了我评论的第二部分。我提到 CRTP 有点过分了 ;)
-
@Troy 嗯....哎呀! ;)
标签: c++ inheritance c++11