在 C++ 中,是否可以将类声明为从另一个类继承?

In C++, is it possible to forward declare a class as inheriting from another class?(在 C++ 中,是否可以将类声明为从另一个类继承?)
本文介绍了在 C++ 中,是否可以将类声明为从另一个类继承?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我知道我可以做到:

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()声明的唯一信息是RBRA 作为公共基类.现在很明显,如果您打算对 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++ 中,是否可以将类声明为从另一个类继承?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

Prevent class inheritance in C++(防止 C++ 中的类继承)
Why should I declare a virtual destructor for an abstract class in C++?(为什么要在 C++ 中为抽象类声明虚拟析构函数?)
Why is Default constructor called in virtual inheritance?(为什么在虚拟继承中调用默认构造函数?)
C++ cast to derived class(C++ 转换为派生类)
C++ virtual function return type(C++虚函数返回类型)
Is there any real risk to deriving from the C++ STL containers?(从 C++ STL 容器派生是否有任何真正的风险?)