C++的封装:
封装的是实现面向对象的第一步,封装就是将数据、函数等集合在一个单元也就是类中,封装的目的是使得代码模块化;封装的意义在于增强安全性和简化编程,使用者不必了解具体的实现细节,而只是通过外部接口以及特定的访问权限来使用类成员。
C++定义了友元函数能够访问类中的私有函数:友元函数
eg:封装一个animal类
#include <bits/stdc++.h>
using namespace std;
class Animal
{
public:
string name;
virtual void get_name(string animal_name)=0;
};
C++的多态:
C++的多态性是通过虚函数实现的,虚函数允许派生类重新定义成员函数,而派生类重新定义基类的做法成为覆盖/重写(重写分2种:重写成员函数,重写虚函数,只有重写虚函数才能体现C++的多态性)。[说到重写,就要提到重载,重载是允许多个同名函数,这些同名函数的参数个数不同、参数类型不同,但重写并没有体现多态性,为什么C++支持重载而C语言不支持重载?]
多态与非多态的实质区别就是函数地址是早绑定还是晚绑定,这里可以看c++的动态绑定和静态绑定;多态的目的就是接口重用。
eg:见下面的例子:
#include <bits/stdc++.h>
using namespace std;
class A
{
public:
void foo()
{
printf("A::foo()
");
}
virtual void fun()
{
printf("A::fun()
");
}
};
class B : public A
{
public:
void foo()
{
printf("B::foo()
");
}
void fun()
{
printf("B::fun()
");
}
};
int main(void)
{
A *a;
B b;
a=&b;
a->foo(); //A::foo()
a->fun(); //B::fun()
cout<<"-----------"<<endl;
A aa;
B *bb;
bb=(B *)&aa;
bb->foo(); //B::foo()
bb->fun(); //A::fun()
return 0;
}
这里的详细的解释见:c++的动态绑定和静态绑定
C++的继承:
继承可以使得子类具有父类的各种属性和方法,而不是需要再次编写相同的代码,在令子类继承父类的同时,子类可以重新定义某些属性,并重新某些方法,即覆盖父类原有属性和方法,使其获得与父类不同的功能。
eg:见下面例子
#include <bits/stdc++.h>
using namespace std;
class A
{
public:
virtual void f1(){cout<<"A::f1()"<<endl;}
virtual void f2(){cout<<"A::f2()"<<endl;}
};
class B : public A
{
public:
/*override的主要作用是告诉编译器该函数覆盖基类的同名函数,能够
*防止人为定义时函数名或者参数不对等,导致未覆盖基类的函数,所以
*添加override能够使程序员的意图更加明显
*/
void f1() override{cout<<"B::f1()"<<endl;}
//final:不允许其它类再次覆盖符f2()函数
void f2() final {cout<<"B::f2()"<<endl;}
};
class C:public B
{
public:
void f1(){cout<<"C::f1()"<<endl;}
// void f2(){cout<<"C::f2()"<<endl;} 出错,f2()被声明成final
};
int main(void)
{
A *a,aa;
B *b,bb;
C *c,cc;
b=(B*)&aa;
b->f1();//A::f1()
b->f2();//B::f2()
c=(C*)&cc;
c->f1();//C:f1()
c->f2();//B::f2()
cout<<"-------------"<<endl;
a=&bb;
a->f1();//B::f1()
a->f2();//B::f2()
b=&cc;
b->f1();//C::f1()
b->f2();//B::f2()
cout<<"-------------"<<endl;
return 0;
}