C++如何使用派生类构造函数销毁基类中的对象

Posted

技术标签:

【中文标题】C++如何使用派生类构造函数销毁基类中的对象【英文标题】:C++ how to destroy an object in the base class with a derived class constructor 【发布时间】:2015-06-13 22:03:02 【问题描述】:

所以在我的程序中,我有一个名为 hangman 的派生类和一个名为 HangmanGraphics 的派生类。我遇到的问题是在游戏结束后我想重置我的变量,但由于某种原因,我的基本构造函数没有重新启动,甚至没有被调用。当我运行程序时,它将转到基本构造函数一次,但在程序结束时:

#include "player.h"
#include "hangman.h"
#include "HangmanGraphics.h"

using namespace std;

int main()


    HangmanGraphics game2;
    while(1)
    
        game2.Play();

        if(game2.Play()=='Y')
        
            game2=HangmanGraphics();

            //in this part of the code I want to reset my base
            //constructor values but how do I do that by using the 
            //derived construtor  

            continue;
        
    

【问题讨论】:

你的派生ctor是否调用基础ctor? @AmiTavory 当我运行程序时,即使我没有在派生构造函数的主体中添加任何内容,也会调用基础构造函数,但是在我通过 continue 之后,永远不会调用基础构造函数 【参考方案1】:

便宜的黑客。将 game2 的定义移到 while 循环中,每次循环都会提供一个新的 game2:

int main()

    while(1)
    
        HangmanGraphics game2; // game2 created here
        // do stuff
     // game2 destroyed here

您的问题中没有提供足够的信息来说明这是好事还是坏事。但是……

game2=HangmanGraphics();

会做五件事:

    调用 HangmanGraphics 的构造函数来创建一个临时的 HangmanGraphics。 这会导致调用 Hangman 的构造函数 调用 HangmanGraphics 的 = 运算符。如果未指定,则默认将右手 HangmanGraphics 的内容复制到左侧。它会复制一个指针,但不会复制指向的数据。 在临时 HangmanGraphics 上调用析构函数 这会导致调用 Hangman 的析构函数

如果您在 HangmanGraphics 或 Hangman 中有任何动态分配的存储,您需要阅读 Rule of Three

在临时 HangmanGraphics 中动态分配的任何内容及其基础 Hangman 都将(或应该已经)被析构函数删除。如果未自定义 operator= 来处理动态数据,则 game2 现在包含指向无效存储的指针。

例子:

class base

public:
    base(): baseval(number++), interestingData(new int(number++))
    
        cout << "base ctor " << baseval << "," << * interestingData <<endl;
    
    virtual ~base()
    
        cout << "base dtor " << baseval << "," << * interestingData <<endl;
        delete interestingData;
    
private:
    int baseval;
    int * interestingData;
;

class derived: public base

public:
    derived():base()
    
        cout << "derived ctor" <<endl;
    
    virtual ~derived()
    
        cout << "derived dtor" <<endl;
    
    derived & operator=(const derived & rhs) //only exists to do the cout
    
        cout << "derived =" <<endl;
        base::operator=(rhs);
        return *this;
    
;

int main()

    derived test;
    cout << "created test" << endl;
    test = derived();
    cout << "exit" << endl;

输出

base ctor 0,1
derived ctor
created test
base ctor 2,3
derived ctor
derived =
derived dtor
base dtor 2,3
exit
derived dtor
base dtor 2,4067440

最后一次打印中的interestingdata 被破坏,因为它指向的地址已被重新分配。更有趣的是,它即将被第二次删除,这会让你的程序崩溃。

【讨论】:

以上是关于C++如何使用派生类构造函数销毁基类中的对象的主要内容,如果未能解决你的问题,请参考以下文章

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

派生类可以有一个不在 C++ 基类中的构造函数吗?

C++入门派生类和基类的构造/析构函数关系

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

如何使 Python 模拟从基类派生?

c++继承总结