三大特性
在 C++ 中,面向对象编程的三大特性是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。
-
封装(Encapsulation):
- 封装是面向对象编程的基本特性之一,它将数据(属性)和行为(方法)封装在一个类中,并对外部隐藏对象的内部实现细节。
- 通过封装,可以实现数据的隐藏和保护,只允许通过公共接口(public methods)来访问和修改对象的状态,从而提高代码的安全性和可维护性。
- 封装还可以实现信息隐藏,使得对象内部的实现细节对外部用户透明,用户只需要关心对象提供的接口而不需要了解具体实现。
-
继承(Inheritance):
- 继承是一种对象间的关系,它允许一个类(子类/派生类)继承另一个类(父类/基类)的属性和方法,从而可以重用已有类的代码并扩展其功能。
- 通过继承,子类可以访问父类的非私有成员,并可以在子类中添加新的成员或重写父类的方法,实现代码的复用和扩展。
- 继承还可以建立类之间的层次关系,使得代码结构更加清晰和易于管理。
-
多态(Polymorphism):
- 多态是指同一操作作用于不同的对象上时,可以产生不同的行为。它分为编译时多态(静态多态,如函数重载、模板)和运行时多态(动态多态,如虚函数)。
- 运行时多态通过虚函数和动态绑定实现,允许将父类指针或引用指向子类对象,在运行时根据对象的实际类型调用相应的方法,实现动态绑定和多态行为。
- 多态性提高了代码的灵活性和可扩展性,使得代码更具通用性和可复用性。
这三大特性共同构成了面向对象编程的基础,通过它们可以实现代码的模块化、复用性和可维护性,提高程序的可读性和可靠性。在 C++ 中,这些特性可以帮助开发者更好地组织和设计代码,从而更高效地实现复杂的软件系统。
C++多态
Base* ba = new Son();//父类指针指向子类
1.1多态必须满足两个条件:
- 必须父类指针或者引用调用虚函数
- 被调用的函数是虚函数,且必须完成对基类的重写
如果满足虚函数,编译器会调用指针指向对象的虚函数,和指针类型无关,;如果不满足多态,编译器会根据指针类型调用虚函数
1.2虚函数:virtual,虚函数只能在类内定义只能是类内的非静态成员函数
virtual void fun() {}//error! 在类外面的函数不能是虚函数
1.3虚函数的重写:子类、父类拥有相同的函数名、参数、返回值,
class Person
{
public:
virtual void fun()
{
cout << "Person->fun()" << endl;
}
};
class Student
{
public:
//子类重写的虚函数可以不加virtual,因为子类继承了父类的虚函数,
//编译器会认为你是想要重写虚函数。
//void fun() 可以直接这样,也对,但不推荐。
virtual void fun()//子类重写父类虚函数
{
cout << "Student->fun()" << endl;
}
};