封装,继承和多态是面向对象的三大特征。其中封装是利用设置访问控制权限来实现的。在C++中,访问控制权限可以用友元、宏和类型转换等方法来破坏。这里介绍一下宏和类型转换的方法。

首先定义一个包含私有成员的类Employee,居然没有定义加薪的接口,摆明不想给涨工资!(employee.h)

class Employee 
{
public:
    Employee(int salary) : salary(salary) {}
    int getSalary()
    {
        return salary;
    }
private:
    int salary;
};

既然老板不想给加薪,只有自己动手了。首先使用宏定义#define private public方法(main.cpp):

#include <iostream>

#define private public
#include "employee.h"
#define private private

using namespace std;

int main()
{
    Employee p = Employee(10000);
    cout << "Original salary: $" << p.getSalary() << endl;

    p.salary = 20000;
    cout << "Current salary: $" << p.getSalary() << endl;

    return 0;
}

运行结果:

Original salary: $10000
Current salary: $20000
请按任意键继续. . .

另外还能用强制类型转换reinterpret_cast的方法。首先定义一个结构相同的类,注意把salary定义为public访问权限。(hacker.h):

class Hacker 
{
public:
    Hacker(int salary) : salary(salary) {}
    int getSalary()
    {
        return salary;
    }
public:
    int salary;
};

然后使用如下方法(main.cpp):

#include <iostream>
#include "employee.h"
#include "hacker.h"

using namespace std;

int main()
{
    Employee p = Employee(10000);
    cout << "Original salary: $" << p.getSalary() << endl;

    Hacker *h = reinterpret_cast<Hacker*>(&p);
    h->salary = 20000;
    cout << "Current salary: $" << p.getSalary() << endl;

    return 0;
}

运行结果同样为:

Original salary: $10000
Current salary: $20000
请按任意键继续. . .

结论:

  1. C++的访问权限并不完备,可以通过友元、宏和强制类型转换等方法破坏。
  2. 参考第一条。