问题描述
我知道我可以做到:
class Foo;
但是我可以转发声明一个类从另一个类继承,例如:
but can I forward declare a class as inheriting from another, like:
class Bar {};
class Foo: public Bar;
<小时>
一个示例用例是协变引用返回类型.
An example use case would be co-variant reference return types.
// somewhere.h
class RA {}
class RB : public RA {}
... 然后在另一个不包含 something.h 的标题中
... and then in another header that doesn't include somewhere.h
// other.h
class RA;
class A {
public:
virtual RA* Foo(); // this only needs the forward deceleration
}
class RB : public RA; // invalid but...
class B {
public:
virtual RB* Foo(); //
}
编译器应该处理RB* B:Foo()声明的唯一信息是RB有RA 作为公共基类.现在很明显,如果您打算对 Foo 的返回值进行任何类型的取消引用,您将需要 something.h.但是,如果某些客户端从不调用 Foo,那么他们就没有理由包含可能会显着加快编译速度的 something.h.
The only information the compiler should need to process the declaration of RB* B:Foo() is that RB has RA as a public base class. Now clearly you would need somewhere.h if you intend to do any sort of dereferencing of the return values from Foo. However, if some clients never calls Foo, then there is no reason for them to include somewhere.h which might significantly speed compilation.
推荐答案
前向声明仅在告诉编译器具有该名称的类确实存在并将在别处声明和定义时才真正有用.在编译器需要有关类的上下文信息的任何情况下,您都不能使用它,编译器也不能仅告诉它有关类的一点点信息.(通常,您只能在没有其他上下文的情况下引用该类时使用前向声明,例如作为参数或返回值.)
A forward declaration is only really useful for telling the compiler that a class with that name does exist and will be declared and defined elsewhere. You can't use it in any case where the compiler needs contextual information about the class, nor is it of any use to the compiler to tell it only a little bit about the class. (Generally, you can only use the forward declaration when referring to that class without other context, e.g. as a parameter or return value.)
因此,在随后使用 Bar 来帮助声明 Foo 的任何情况下,您都无法转发声明 Bar,并且具有包含基类的转发声明完全没有意义——那是什么?告诉你除了什么?
Thus, you can't forward declare Bar in any scenario where you then use it to help declare Foo, and it flat-out doesn't make sense to have a forward declaration that includes the base class -- what does that tell you besides nothing?
这篇关于在 C++ 中,是否可以将类声明为从另一个类继承?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)