Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?_C++_Oop_Inheritance_Function Prototypes - Fatal编程技术网

C++ 如何在C++;?

C++ 如何在C++;?,c++,oop,inheritance,function-prototypes,C++,Oop,Inheritance,Function Prototypes,我正在做一个项目,它需要多个类,其中一些是继承的!! 因此,在定义主类之前,我在主类中使用一个继承类! 请帮助我如何使用继承类的原型声明。谢谢 例如: class A { /*data*/ }; class B:public A {public: void func() { C obj; } }; class C:public B { };` 只有函数有原型。使用类可以做的是向前声明它 class MyFutureClass; struct

我正在做一个项目,它需要多个类,其中一些是继承的!! 因此,在定义主类之前,我在主类中使用一个继承类! 请帮助我如何使用继承类的原型声明。谢谢

例如:

  class A
{
  /*data*/
};
  class B:public A 
 {public:
   void func()
   {
       C obj;
   }
   };
class C:public B
{
};`

只有函数有原型。使用类可以做的是向前声明它

class MyFutureClass;
struct MyFutureStruct;
这些是一个不完整的类。不,C++中的结构与类相同,只是默认情况下有公共访问,类具有私有。为了使它们完整,您应该在代码的任何地方提供定义

不完整类只是一种可能的不完整类型。以下类型为不完整类型:

  • 类型无效
  • 已声明但未定义的类类型
  • 未知大小的数组
  • 不完整类型的元素数组
  • 枚举类型,直到确定其基础类型为止
现在您可以使用不完整类做什么?

  • 声明指针变量或类字段
  • 声明一个函数或方法,该函数或方法接受不完整类型的参数或返回,而不定义它
  • 你不能用它做什么?

  • 由其他类继承不完整的类
  • 定义类型不完整的对象字段
  • 声明类型不完整的非静态类数据成员
  • 使用不完整的类类型作为模板的参数
  • 定义使用不完整类型的参数或
  • 执行隐式或显式转换到不完整类、隐式或显式、左值到右值转换、标准转换、动态转换或静态转换到指针或不完整类型的引用,从空指针常量或指针转换到void时除外(void*始终可以转换,并且从不定义void)
  • 访问不完整类的成员或方法
  • 使用新表达式创建类型不完整的对象
  • 在catch子句中使用它
  • 使用typeid、sizeof或alignof运算符
  • 在指向不完整类的指针上使用算术运算符(当然,因为sizof是未知的)
  • 需要它做什么?

  • 为了避免头的循环依赖性,当一个类依赖于另一个类的存在和功能时
  • 减少单个文件中包含的标题数量。您可以定义获得已声明类的指针和形式参数的类,而无需定义它
  • 让我们看看,这是一个绝对无用的避免循环使用头的例子

    [a.h类]

    class B;
    
    class A
    {
        B* p;
    public:
        A ( B& value );
    };
    
    [类别b.h]

    #include "class_a.h"
    
    class B : public A   // we need complete A to inherit it
    {
        int a;
    public:
        B ( const B& );
    };
    
    [a类cpp]

    #include "class_b.h"
    
    // to define this constructor we need complete A, but header with complete 
    // definition is already included within class_b.h header
    
    A::A ( B& val) : p( new B(val))   // we created copy of B
    {
    }
    
    所以,为了定义类A,我们需要类B,但是类B是类A的子类,所以它需要完整的定义A。难题?不需要。由于转发声明,我们可以在不定义B的情况下定义类A


    (注:如果有人检查了代码,发现那里有不可能的地方,我将明确允许修复它…我睡着了)

    您需要显示您拥有的代码您的意思是要转发声明它吗?如果是这样的话,前向声明将产生完整的类型,而从不完整的类型继承是不可能的。@DanielCollier现在我已经写了一个示例@我不知道你想要什么,你不能从一个不完整的类型继承。您也不能实例化不完整类型的对象,您所能做的只是创建不完整类型的指针或引用的实例。不确定您想要完成什么,但在任何情况下您都可以做一些您无论如何都应该做的事情:将声明和实现分离到头文件和源文件中。在您的例子中,这将产生6个文件,A.h、A.cpp、B.h等。由于C仅用于B::func的实现中,所以这不会有问题,因为B.cpp只包含C.h,而B.h不需要C,这里没有问题。您可以使用
    struct
    关键字转发声明类,反之亦然。“我不这么认为,但这是完全正确的。”艾伦·斯托克斯是的,我知道,只有在定义阶段的访问权限不同,它们总是类