公有继承和私有继承
公有继承:是一个的概念
私有继承:有一个的概念
公有继承和组合都是代码复用的方式
公有继承,父类细节子类可见,其代码属于白盒式的复用,意味着当设计学生这个对象时,学生这个对象也可以调用父类里面的成员方法
举例:人和学生
//赋值兼容性规则:前提条件,公有继承
//**调用函数时,除了虚函数以外,静态绑定,在编译时确定**
class Person
{
int value;
public:
Person(int x=0):value(x){}
void print() { cout << "Person" << endl; }
};
class Student :public Person
{
int num;
public:
Student(int x=0):Person(x+10),num(x){}
void print() { cout << "Student" << endl; }
};
int main()
{
Person per;
Student s1(10);
per = s1; //人不能赋值给学生
Person* p1 = &s1;//只能看见学生中的基类对象
p1->print();//调用的是人的print函数
((student*))p1->print();//强转可以,但是p1->student::print();不行
return 0;
}
举例:汽车和引擎
组合和私有继承
意味着“用…来实现”;对象之间的内部细节不可见,其代码属于黑盒复用方式
class Engine
{
private:
int cylinderNum;
public:
Engine(int n=4):cylinderNum(n){}
~Engine(){}
void EnStart(){}
};
class Car :private Engine
{
private:
public:
Car(int n=4):Engine(n){}
~Car(){}
void Start()
{
Engine::EnStart();
}
};
int main()
{
Car car;
car.Start();
//car.Engine();//error
}
私有继承和组合如何选择?
尽可能使用组合,必须是使用私有继承,有保护属性和虚函数介入时考虑私有继承。
继承与静态成员
class Person
{
public:
static int num;
};
int Person::num = 0;
class Student :public Person
{
public:
Student() { cout << "Create Student: " << ++num << endl; }
~Student() { cout << "Destory Student: " << num-- << endl;}
};
class Employee:public Person
{
public:
Employee() { cout << "Create Employee: " << ++num << endl; }
~Employee() { cout << "Destory Empolyee: "<<num-- << endl; }
};
int main()
{
Student s1, s2,s3;
Employee e1, e2;
cout << &s1.num << endl; //地址相同
cout << &e1.num << endl;
return 0;
}
友元和继承关系
友元不具有继承性
using namespace std;
class Student;
class Person
{
private:
int idPerson;
public:
Person(int id=1):idPerson(id){}
friend void fun(Student& s);
};
class Student:public Person
{
private:int snum;
public:
Student(int id = 1,int s=2):Person(id),snum(s){}
};
void fun(Student& s)
{
s.idPerson = 10;
//s.snum = 200;//error
}
int main()
{
Student s1;
fun(s1);
}
多重继承
单一继承:一个派生类只有一个直接基类的情况称为单一继承
多重继承:由多个基类共同派生出新的派生类,这样的继承结构被称为多重继承