如何在c++的基类中创建派生类的对象

How to create an object of a derived class in a base class in c++

本文关键字:创建 派生 对象 基类 c++      更新时间:2023-10-16

你好,我正在尝试创建一个程序,但我遇到了一些麻烦,我有3个类叫做Goku vegeta Beerus, Goku是基类,vegeta和Beerus从Goku继承,我想创建一个名为rose的vegeta对象和一个名为god的Beerus对象在Goku内部,但我得到了错误,有人能指出我将如何做到这一点,所有的帮助都是赞赏程序如下:

class Goku
{    public:
     Goku(); 
   ˜ Goku();
   string get_Name(void); 
   int get_power(void)
 // This is what i want to do but keep getting errors
   vegeta* rose;
   Beerus* god;

};
class vegeta: public Goku
{
  public:
    vegeta(); //an intitializtion constructor
 ˜ vegeta();//destructor
   string get_Name(void); 
   int get_power(void)
};
class Beerus: public Goku
{      public:
       Beerus(); //an intitializtion constructor
      ˜ Beerus();//destructor
      string get_Name(void); 
     int get_power(void)
};

注意我得到的错误是:vegeta不能命名一个类型Beerus不能命名一个类型

使用预声明类
类定义可能驻留在其他地方。但是这个类可以用于指向内存区域的指针。

class Beerus;         // pre-declaring class
class GokuBlack;      // pre-declaring class
class Goku
{
public:
    Goku();
    ~Goku();
    string get_Name(void);
    int get_power(void);

    GokuBlack* rose;
    Beerus* god;
};
class vegeta : public Goku
{
public:
    vegeta(); //an intitializtion constructor
    ~vegeta();
    string get_Name(void);
    int get_power(void);
};
class Beerus : public Goku
{
public:
    Beerus(); //an intitializtion constructor
    ~Beerus();
    string get_Name(void);
    int get_power(void);
};

你的类有一个错误。当前,当您这样做时:

vegeta* rose;
Beerus* god;

此时,编译器不知道vegetaBeerus是什么。为了解决这个问题,在代码的开头添加以下两行:

class Beerus;    
class vegeta;

这告诉编译器,如果上面两个类中的一个被引用,在被完全定义之前,如在实例化中,那么编译器可以在文件的其余部分中查找该名称。


生活例子

让我们不讨论包含,只讨论转发声明,考虑:

#include "stdafx.h"
#include <iostream>
using namespace std;

class A;
class B;
class B
{
public:
    B();
    void print() { aObj->print(); } // error
    private:
        A* aObj; // it's ok because it's declared
};
B::B()
{
    aObj = new A; // error
}
class A
{
 public:
    A(){}
    void print() { cout << "A prints" << endl; }
};

现在的解决方案:

只需将构造函数B的定义移到类A下,并将B的print()移到类A下,一切就ok了!因为当初始化aObj时,它会在上面找到一个完整的a这是我们在使用包含类实现的头文件时使用的所以代码变成这样:

class A;
class B;
class B
{
    public:
        B();
        void print(); // just prototype
    private:
        A* aObj;
};
class A
{
     public:
     A(){}
     void print() { cout << "A prints" << endl; }
};
B::B()
{
    aObj = new A; // correct
}
void B::print()
{
     aObj->print(); // ok
}