上一篇讲完之后...这一篇继续撸起来~~~~~~~~~~~~~~~~~
1.派生类的继承方式
单继承方式:
多继承方式:
2单继承方式的构造和析构函数顺序:
派生类构造函数的调用顺序如下:
(1)基类的构造函数
(2)派生类的构造函数
当撤销派生类对象时候,析构函数的调用刚好相反
注意:
无论是单继承方式还是多继承方式,派生类的构造函数必须调用基类的构造函数来初始化基类成员。
假设CStudent继承基类CPeople
CStudent::CStudent(char* name,char* no):CPeople(name)//通过这种方式调用基类,其中假设name是基类的私有成员
3.多继承方式
比如小明既是老师也是学生
那么有class CXiao:public CTeacher,public CStudent{ } //其中CTeacher和CStudent是两个基类
4虚函数
CPeople* pe; //其中CPeople是基类,且其成员函数display()是一个虚函数
pe=&st1;
pe->display(); //此时显示的是派生类str1中重写的display,而不是基类的display
pe=&st2;
pe->display(); //此时显示的是派生类str2中重写的display,而不是基类的display
1.一旦基类的某个函数被声明成虚函数,则在所有的派生类中它都是虚函数。
2.修饰基类中的成员函数要想成为虚函数,它必须是public或者是protected的。
3.派生类中重写的虚函数应该与基类的虚函数完全一样,包括虚函数的返回值类型。
5 友元
通常,类的私有和保护数据成员只能在类中由该类的成员函数访问,类的对象及外部函数只能访问该类的公有成员函数,而友元就厉害了!都可以访问~~~~~~~
我们在类中用friend关键字声明一个函数,且该函数的形参中含有该类的对象形参,这个函数便可通过形参对象来访问该类的任何私有和保护成员,即友元关系
情况一:友元外部函数
class CPerson{
friend void change(CPerson &pt)//友元外部函数
private:
char name[10];
protected:
int age;
public:
void display();
}
情况二:友元成员函数
贴出例子,创建Dog.h,Dog.cpp, Person.h, Person.cpp 以及主函数friendTest.cpp
/*************************Dog.h***************************************************/
#pragma once
#include "Person.h"
class CDog
{
friend void CPerson::changeDogName(CDog& d);//将CPerson::changeDogName()设置为友元函数,这种情况属于情况二
public:
CDog(char* name);
~CDog();
private:
char name[10];
public:
void display();
};
#include "Person.h"
class CDog
{
friend void CPerson::changeDogName(CDog& d);//将CPerson::changeDogName()设置为友元函数,这种情况属于情况二
public:
CDog(char* name);
~CDog();
private:
char name[10];
public:
void display();
};
/*************************Dog.cpp***************************************************/
#include "Dog.h"
#include <iostream>
using namespace std;
CDog::CDog(char* name)
{
strcpy(this->name,name);
}
CDog::~CDog()
{
}
void CDog::display()
{
cout << "name: " << name << endl;
}
#include <iostream>
using namespace std;
CDog::CDog(char* name)
{
strcpy(this->name,name);
}
CDog::~CDog()
{
}
void CDog::display()
{
cout << "name: " << name << endl;
}
/*********************Person.h*****************************************************/
#pragma once
class CDog;
class CPerson
{
friend void change(CPerson& p); //将change设置为友元函数,这种情况属于情况一
public:
CPerson(char* name);
~CPerson();
private:
char name[10];
public:
void display();
void changeDogName(CDog& d);
};
/************************************Person.cpp******************************/
class CDog;
class CPerson
{
friend void change(CPerson& p); //将change设置为友元函数,这种情况属于情况一
public:
CPerson(char* name);
~CPerson();
private:
char name[10];
public:
void display();
void changeDogName(CDog& d);
};
/************************************Person.cpp******************************/
#include "Person.h"
#include <iostream>
#include "Dog.h"
using namespace std;
CPerson::CPerson(char* name)
{
strcpy(this->name,name);
}
CPerson::~CPerson()
{
}
void CPerson::display()
{
cout << "name: " << name << endl;
}
void change(CPerson& p)
{
strcpy(p.name, "lisi");
}
void CPerson::changeDogName(CDog& d)
{
strcpy(d.name, "mybaby");
}
#include <iostream>
#include "Dog.h"
using namespace std;
CPerson::CPerson(char* name)
{
strcpy(this->name,name);
}
CPerson::~CPerson()
{
}
void CPerson::display()
{
cout << "name: " << name << endl;
}
void change(CPerson& p)
{
strcpy(p.name, "lisi");
}
void CPerson::changeDogName(CDog& d)
{
strcpy(d.name, "mybaby");
}
/***************************friendTest.cpp***************************************/
#include "Person.h"
#include <iostream>
#include "Dog.h"
using namespace std;
int main()
{
CPerson per("zhang");
CDog dog("mydog");
change(per);
per.changeDogName(dog);
#include <iostream>
#include "Dog.h"
using namespace std;
int main()
{
CPerson per("zhang");
CDog dog("mydog");
change(per);
per.changeDogName(dog);
dog.display();
per.display();
system("pause");
return 0;
}
6.静态成员
如何实现数据共享? 设置全局变量和全局对象
但是面临的问题是,这样严重破坏类的封装性,以及导致程序混乱,一旦程序变大,维护量极具上升。
因此静态成员应运而生.....................
/******************************Sum.h*******************************************/
#pragma once
class CSum
{
public:
CSum(void);
~CSum(void);
private:
static int total;
public:
void clickme();
void display();
};
/**************************Sum.cpp***********************************/
#include "Sum.h"
#include <iostream>
using namespace std;
CSum::CSum(void)
{
}
CSum::~CSum(void)
{
}
void CSum::click()
{
total++;
}
void CSum::display()
{
cout<<"total: "<<total<<endl;
}
int CSum::total =10;
/**********************staticTest.cpp*******************************/
#include <iostream>
#include "Sum.h"
using namespace std;
int main()
{
CSum sum1;
CSum sum2;
sum1.clickme();
sum2.clickme();
sum1.clickme();
sum1.display(); // 输出 total=13
system("pause");
return 0;
}
静态成员函数
静态成员函数和静态数据成员,都不专属于某个对象,而是所有对象所公有的成员
静态成员函数不能直接引用类中非静态成员,只能引用静态数据成员。