30/09/2018, 19:12

C++ OOP không đảm bảo được tính đóng gói trong một số trường hợp

Nhìn vào đoạn code bên dưới, ta thấy rằng thuộc tính number của class Test được đặt trong private section, ngoài constructor, destructor ra thì chỉ có mỗi phương thức get để lấy giá trị của number.

// Example program
#include <iostream>
#include <string>

using namespace std;

class Test  {
public:
    Test()  {
        number = 0;
    }
    
    ~Test() {
    }
    
    int getNumber() { return number; }

private:
    int number;
};

int main()
{
    Test *t = new Test();
    int* p = (int*)t;
    *p = 10;
    cout << t->getNumber() << endl;
    return 0;
}

Kết quả chương trình:

10

Điều đó cho thấy với một số class được thiết kế đơn giản thì private section không đảm bảo được việc che giấu thông tin.

Lỗi này có thể khắc phục được bằng cách thêm vào từ khóa virual trước bất kì phương thức nào trong class Test.

// Example program
#include <iostream>
#include <string>

using namespace std;

class Test  {
public:
    Test()  {
        number = 0;
    }
    
    virtual ~Test() {
    }
    
    int getNumber() { return number; }

private:
    int number;
};

int main()
{
    Test *t = new Test();
    int* p = (int*)t;
    *p = 10;
    cout << t->getNumber() << endl;
    
    return 0;
}

Nguồn tham khảo: http://www.geeksforgeeks.org/can-access-private-data-members-class-without-using-member-friend-function/

Bài liên quan
0