在介绍继承和派生之前,先看下面一段代码
class Student1 {
public:
int m_socre;
int m_age;
void speak() {
cout << "Student1-speak()" << endl;
}
};
class Student2 {
public:
int m_socre;
int m_height;
void speak() {
cout << "Student2-speak()" << endl;
}
};
class Person {
public:
Student1 s1;
Student2 s2;
void speak() {
cout << "Person-speak()" << endl;
}
};
int main() {
Person person;
person.s1.m_age = 10;
cout << "Student1-age="<<person.s1.m_age << endl;
person.speak();
person.s1.speak();
person.s2.speak();
getchar();
return 0;
}
运行结果
Student1-age=10
Person-speak()
Student1-speak()
Student2-speak()
-
说明
从上面的代码中可以看出,Student1 类和 Student2 类有公共的成员变量和成员函数,此时可以通过在Person类定义这两个类的的对象,从而来访问这些类的成员变量和函数(这里只是采用了嵌套)。这样写代码会觉得很繁琐,一旦当公共成员很多的时候就觉得很麻烦,此时C++提供了一种继承机制来解决这种问题
继承(父类和子类)
-
当多个类中公共的成员时,此时就可以将这些公共成员放在一个类中,我们将这个类称之为基类,而需要用到这个类中成员的类我们就称之为子类(派生类),子类中可以定义不同于父类的成员。它们之间的关系就成为继承。
-
特点
1、提高了代码的复用性
2、提高了代码的维护性
3、让类与类之间产生了关系,这是多态的前提 -
格式
class 派生类名 :继承方式 基类名{
派生类新增成员
};
此时上面的代码可以改写为
class Person {
public:
int m_socre;
void speak() {
cout << "Person-speak()" << endl;
}
};
class Student1 :public Person{
public:
int m_age;
void speak() {
cout << "Student1-speak()" << endl;
}
};
class Student2 :public Person {
public:
int m_height;
void speak() {
cout << "Student2-speak()" << endl;
}
};
int main() {
Student1 s1;
Student2 s2;
s1.m_age = 10;
s1.m_socre = 100;
cout << s1.m_age<<" "<< s1.m_socre << endl;
s1.speak();
s2.m_height = 11;
s2.m_socre = 101;
cout << s2.m_height << " "<<s2.m_socre << endl;
s2.speak();
getchar();
return 0;
}
派生类的访问控制
-
成员访问权限、继承方式有3种
1、public:公共的,任何地方都可以访问(struct默认)
2、protected:子类内部、当前类内部可以访问
3、private:私有的,只有当前类内部可以访问(class默认) -
用的最多的继承方式是public,这样能保留父类原来的成员访问权限
-
访问权限不影响对象的内存布局
总结:
1、所谓继承,就是把父类的所有成员复制到子类中而已,只不过private成员在子类中不能被调用和访问而已,但是还是会占用子类的对象的内存
2、要想毫无保留的使用基类成员,就将父类成员定义为public或者protected
3、也就是说,子类内部访问父类成员的权限,是成员本身的访问权限和上一级父类的继承方式中权限最小的那个权限
补充:
单继承下的内存模型