1、三种继承说明:
2、继承的一般格式:
class Student
{
public:
Student(int id, char *name)
{
this->name = name;
this->id = id;
}
void printS()
{
cout << "id = " << id << " name =" << name << endl;
}
private:
string name;
int id;
};
class Student2 : public Student
{
public:
Student2(int id, char * name, int score) : Student(id, name)//子类继承过来的成员变量 通过父类的构造器来构造,会调父类的构造函数
{
this->score = score;
}
void printS()
{
Student::printS();// 先调用父类中的方法
cout << "score = " << this->score << endl;
}
private:
int score;//添加的一个成员变量
};
3、关于继承时,有关类兼容性的几点总结:
3.1 子类对象可以当作父类对象使用。
3.2 子类对象可以直接赋值给父类对象。
3.3 子类对象可以直接初始化父类对象。
3.4 父类指针可以直接指向子类对象。
3.5 父类引用可以直接引用子类对象。
class Parent
{
public:
void printP()
{
cout << "Parent::printP()..." << endl;
}
int a;
};
class Child :public Parent
{
public:
void printC()
{
cout << "Child:: printC()...." << endl;
}
int b;
};
int main(void)
{
Child c;//子类对象
c.printP(); //子类对象可以当作父类对象使用
Parent p = c; // 由于子类拥有全部父类的内存空间,子类能够保障父类初始化完整。
//子类对象可以直接初始化父类对象 因为子类内存空间包容的父类的,能够保证完全赋值。
//Child c2 = p;//反过来赋值不行,因为子类中有的,父类中不一定有。
//父类指针可以直接指向子类对象,因为父类中有的,子类中一定有。
Parent *pp = &c;
//不能用子类指针指向父类对象。
//Child *cp = &p; // cp-> printP, cp->printC
//cp->b; //p中没有b的内存。 //此时访问b就越界了。
//父类引用可以引用子类对象
Parent &pr = c;
//子类引用不可以引用父类的对象。
//Child &cr = p;
return 0;
}
4、继承的几点总结:
4.1 父类又叫做基类。子类又叫做派生类。
4.2 一般都是公有继承。
4.3 子类继承于父类, 父类中的成员变量 应该用 父类的构造函数来初始化
4.4静态成员变量在父类和子类中是共用的,在内存中只有一份。
5、多继承和虚继承:
//家具类
class Furniture
{
public:
int m; //材质
};
//如果子类虚继承本类, 编译器会将父类中的成员, 只拷贝一份。
//床类
class Bed: virtual public Furniture
{
public:
void sleep()
{
cout << "在床上睡觉" << endl;
}
};
//沙发类
class Sofa :virtual public Furniture
{
public:
void sit()
{
cout << "在沙发上睡觉" << endl;
}
};
//沙发床
class SofaBed :public Bed, public Sofa
{
public:
void sitAndSleep()
{
sit();//sofa
sleep();//bed
}
};