1.虚函数,纯虚函数
虚函数用来提供给程序能够通过指向基类的指针,来调用具体派生类的该函数实现,是多态的实现方式
纯虚函数定义方式如下:
1 class A
2 {
3 public:
4 virtual void f() = 0; // 说明f函数为纯虚函数
5 virtual void g();
6 };
含有纯虚函数的类称为抽象类,virtual f() = 0;
抽象类不能实例化.。它仅仅用来抽象出一层方法描述,不必实现,所以对其实例化没有任何意义。
纯虚函数是一个在基类中说明得虚函数,他在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本。实际上,他与一般虚函数成员在书写 格式上的不同就在于后面加了 "=0 "。声明为纯虚函数之后,基类中就不再给出函数的实现部分。纯虚函数得函数体由派生类给出。
2.继承、多继承
多继承的主要问题是要注意二义性的问题,从多个路径继承过来的基类的相同数据成员,为避免二义性,需要定义为虚继承:
1 class Top
2 {
3 public:
4 int a;
5 };
6
7 class Left : virtual public Top
8 {
9 public:
10 int b;
11 };
12
13 class Right : virtual public Top
14 {
15 public:
16 int c;
17 };
18
19 class Bottom : public Left, public Right
20 {
21 public:
22 int d;
23 };
3. C++ static用法
a.静态数据成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。
1 class Myclass
2 {
3 public:
4 Myclass(int a,int b,int c);
5 void GetSum();
6 private:
7 int a,b,c;
8 static int Sum;//声明静态数据成员
9 };
10
11 int Myclass::Sum=0;//定义并初始化静态数据成员
静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
b.静态成员函数
静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函 数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如 函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义 上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
1 class Myclass
2 {
3 public:
4 Myclass(int a,int b,int c);
5 static void GetSum();/声明静态成员函数
6 private:
7 int a,b,c;
8 static int Sum;//声明静态数据成员
9 };
10 int Myclass::Sum=0;//定义并初始化静态数据成员
11
12 Myclass::Myclass(int a,int b,int c)
13 {
14 this->a=a;
15 this->b=b;
16 this->c=c;
17 Sum+=a+b+c; //非静态成员函数可以访问静态数据成员
18 }
19
20 void Myclass::GetSum() //静态成员函数的实现
21 {
22 // cout<<a<<endl; //错误代码,a是非静态数据成员
23 cout<<"Sum="<<Sum<<endl;
24 }
25
26 void main()
27 {
28 Myclass M(1,2,3);
29 M.GetSum();
30 Myclass N(4,5,6);
31 N.GetSum();
32 Myclass::GetSum();
33 }
原文链接: https://www.cnblogs.com/waynelu/archive/2012/07/05/2577138.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/54450
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!