目录
一.继承&复用&组合的区别
1)函数复用与继承区别
2)复用的分类
[1]白箱复用——继承
[2]黑箱复用——组合(优先)
二.继承的基本格式与继承以后的访问方式变化(基类成员)
1)基本格式

2)三种继承方式
3)在派生类中不可见
4)基类成员经过不同继承以后分别到派生类的什么作用域中【访问方式变化】
5)struct和class的默认继承方式
6)实际运用中一般使用都是public继承的原因
三.基类和派生类对象赋值转换【切片概念】
class Person
{
protected :
string _name;
string _sex;
int _age;
};
class Student : public Person
{
public :
int _No ;
};
void Test ()
{
Student sobj ;
Person pobj = sobj ;
Person* pp = &sobj;
Person& rp = sobj;
sobj = pobj;
pp = &sobj
Student* ps1 = (Student*)pp;
ps1->_No = 10;
pp = &pobj;
Student* ps2 = (Student*)pp;
ps2->_No = 10;
}
四.继承中的【隐藏】
五.派生类的默认成员函数生成机制
六.“友元关系”不能被继承
class Student;
class Person
{
public:
friend void Display(const Person& p, const Student& s);
protected:
string _name;
};
class Student : public Person
{
protected:
int _stuNum;
};
void Display(const Person& p, const Student& s)
{
cout << p._name << endl;
cout << s._stuNum << endl;
}
void main()
{
Person p;
Student s;
Display(p, s);
}
七.基类定义了static静态成员,整个继承体系里面只有一个这样的成员
class Person
{
public :
Person () {++ _count ;}
protected :
string _name ;
public :
static int _count;
};
int Person :: _count = 0;
class Student : public Person
{
protected :
int _stuNum ;
};
class Graduate : public Student
{
protected :
string _seminarCourse ;
};
void TestPerson()
{
Student s1 ;
Student s2 ;
Student s3 ;
Graduate s4 ;
cout <<" 人数 :"<< Person ::_count << endl;
Student ::_count = 0;
cout <<" 人数 :"<< Person ::_count << endl;
}
八.复杂的菱形继承及菱形虚拟继承
1)菱形继承
class Person
{
public :
string _name ;
};
class Student : public Person
{
protected :
int _num ;
};
class Teacher : public Person
{
protected :
int _id ;
};
class Assistant : public Student, public Teacher
{
protected :
string _majorCourse ;
};
void Test ()
{
Assistant a ;
a._name = "peter";
a.Student::_name = "xxx";
a.Teacher::_name = "yyy";
}
2)解决菱形继承问题方法:虚拟继承
class Person
{
public :
string _name ;
};
class Student : virtual public Person
{
protected :
int _num ;
};
class Teacher : virtual public Person
{
protected :
int _id ;
};
class Assistant : public Student, public Teacher
{
protected :
string _majorCourse ;
};
void Test ()
{
Assistant a ;
a._name = "peter";
}
3)虚拟继承解决菱形继承原理————虚基表&虚基表指针&利用偏移量
【1】虚拟继承前后的内存模型变化