C++.构造函数(超出范围)_01

环境:Win7x64、Qt5.3.2 MSVC2010 OpenGL、vs2010

1、ZC:在 构造函数 中,基类访问子类的成员 会报内存错误,如果访问的是 基本类型的话(如int) 可能还不会出错,如果访问的是 类似 QList<Tbase*>类型的成员的话 就会出错。

  本类构造函数 访问 本类的成员或者基类的成员的话,不会出错(∵ 也就是这么做的,如初始化成员变量)

  猜想:本类访问子类的 成员变量的时候,可能有些成员变量还未分配好空间??(反正这样做就是不可靠...)

2、测试代码:

#include <QDebug>
#include <QMap>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

class TA;

class Tbase
{
public:
    Tbase();

public:
    int FiBase;

public:
    QList<Tbase*> FlistBase;
    void AddBase(Tbase *_p);
};

class TA :public Tbase
{
public:
    TA():Tbase(){}

public:
    int FiA;
    void SetA(int _i) {FiA = _i;}

public:
    QList<Tbase*> FlistA;
    void AddA(Tbase *_p);
};

Tbase::Tbase()
{
    ((TA*)this)->FiA = 10;
    ((TA*)this)->SetA( 50 );

    this->AddBase(this);
    ((TA*)this)->AddA(this);
}

void Tbase::AddBase(Tbase *_p)
{
  qDebug() << "Tbase::AddBase(..) - 1";
    if (-1 == FlistBase.indexOf(_p))
    {
    qDebug() << "Tbase::AddBase(..) - 2";
        FlistBase.append(_p);
    qDebug() << "Tbase::AddBase(..) - 3";
    }
  qDebug() << "Tbase::AddBase(..) - 4";
}

void TA::AddA(Tbase* _p)
{
  qDebug() << "TA::AddA(..) - 1";
    if (-1 == FlistA.indexOf(_p))
    {
    qDebug() << "TA::AddA(..) - 2";
        FlistA.append(_p);
    qDebug() << "TA::AddA(..) - 3";
    }
  qDebug() << "TA::AddA(..) - 4";
}

void MainWindow::on_pushButton_clicked()
{
    TA a;// = new TA;
    qDebug() << a.FiA;
}

3、控制台输出:

Starting E:Z_Qt5Qt532_vs2010uild-Test2-Desktop_Qt_5_3_MSVC2010_OpenGL_32bit-Release
eleaseTest2.exe...
Tbase::AddBase(..) - 1
Tbase::AddBase(..) - 2
Tbase::AddBase(..) - 3
Tbase::AddBase(..) - 4
TA::AddA(..) - 1
TA::AddA(..) - 2
程序异常结束。
E:Z_Qt5Qt532_vs2010uild-Test2-Desktop_Qt_5_3_MSVC2010_OpenGL_32bit-Release
eleaseTest2.exe crashed

4、

5、

原文地址:https://www.cnblogs.com/cppskill/p/9518577.html