类私有成员变量突破类的限制被外部调用

来源:互联网 发布:sqlyog导入数据库 编辑:程序博客网 时间:2024/06/01 21:53

主要思想:通过公有成员函数将私有成员变量地址传出去,在外部取得该地址,然后通过外部指针修改此地址的值,则此私有成员变量的值也改变了,突破了对象及类成员函数调用私有成员变量的限制,同理,成员函数的地址如果被外部获取(例如使用模板时),则可以突破对象,调用此成员函数。

对策:一般不应把私有成员变量地址或引用及成员函数的地址做为成员函数返回值,防止被外部获取。

以下代码用QT编写,其他平台类似。

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QDebug>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:   explicit MainWindow(QWidget *parent = 0);   int* ptest();    void display();   ~MainWindow();private:  Ui::MainWindow *ui;     int test;};#endif 

mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :  QMainWindow(parent), ui(new Ui::MainWindow){        ui->setupUi(this);      test=5;}int *MainWindow::ptest(){       return &test;}void MainWindow::display(){       qDebug()<<test;}MainWindow::~MainWindow(){          delete ui;}

main.cpp

#include "mainwindow.h"#include <QApplication>#include <QDebug>int main(int argc, char *argv[]){       QApplication a(argc, argv);    MainWindow w;    w.show();    w.display();    //5    int* aa;    aa=w.ptest();    qDebug()<<*aa;   //5    *aa=20;    qDebug()<<*aa;   //20    w.display();     //20    return a.exec();}

输出:5 5 20 20

0 0