C++-带你初步走进继承(2)
5.继承与友元
友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。
class Student;
class Person
{
public:
friend void Display(const Person& p, const Student& s);
protected:
string _name="张三"; // 姓名
};
class Student : public Person
{
public:
friend void Display(const Person& p, const Student& s);
protected:
int _stuNum = 0; // 学号
};
void Display(const Person& p, const Student& s)
{
cout << p._name<< endl;
cout << s._stuNum << endl;
}
int main()
{
Person p;
Student s;
Display(p, s);
return 0;
}
也就是说,基类的友元不是派生类的友元,如果想让派生类也可以使用这个函数,就需要在派生类的内部声明这个友元函数,否则访问不了派生类的成员。
6. 继承与静态成员
class Person
{
public:
Person() { ++_count; }
protected:
string _name; // 姓名
public:
static int _count; // 统计人的个数。
};
int Person::_count = 0;
class Student : public Person
{
protected:
int _stuNum; // 学号
};
int main()
{
Person p;
Student s1;
Student s2;
Student s3;
cout << " 人数 :" << Person::_count << endl;
Student::_count = 0;
cout << " 人数 :" << Person::_count << endl;
return 0;
}
上面这段代码的作用就是统计个数,因为派生类的对象在实例化时一定会调用基类的构造函数,所以这个_count就会++,并且是同一个_count。
7.复杂的菱形继承及菱形虚拟继承
菱形继承:菱形继承是多继承的一种特殊情况。
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; // 主修课程
};
当我实例化了一个Assistant对象时,再访问成员变量_name就会报错,因为_name有两份,一份是Teacher的,一份是Student的.
下面这个是正确用法。
8.继承的总结和反思
今天的分享到这里就结束了,感谢大家的阅读!
原文地址:https://blog.csdn.net/2301_79035870/article/details/136185506
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!