大理网站开发,网络维护专业,唐山制作网站软件,计算机企业网站建设论文在上篇文章中#xff0c;给出了关于继承这部分的相关知识#xff0c;例如继承的定义#xff0c;继承与默认成员函数等。本文将针对复杂的继承方式#xff0c;
1. 复杂的继承方式#xff1a;
1.1 单继承#xff1a;
class Professor
{
public:int _age;string _name;
}… 在上篇文章中给出了关于继承这部分的相关知识例如继承的定义继承与默认成员函数等。本文将针对复杂的继承方式
1. 复杂的继承方式
1.1 单继承
class Professor
{
public:int _age;string _name;
};class Teacher : public Professor
{public:int _tele;
};class Student : public Teacher
{
public:int _weight;
};
对于上面给出的代码如果适用图形来表示这三个类之间的结构具体如下 对于这种一个子类只有一个直接父类时称这种继承关系为单继承。 1.2 多继承
class Professor
{
public:int _age;string _name;
};class Teacher
{public:int _tele;
};class Student : public Professor, public Teacher
{
public:int _weight;
};
对于上面给出代码可以用下面的图形来表示这几个类的继承关系 对于这种一个子类有两个或者两个以上的直接父类的关系叫做多继承。 在多继承中存在着一种特殊的继承关系菱形继承例如下面给出的代码
class Person
{
public:int _ads;};class Professor : public Person
{
public:int _age;string _name;
};class Teacher : public Person
{public:int _tele;
};class Student : public Professor, public Teacher
{
public:int _weight;
};
其结构可由下图表示 对于菱形继承其存在着一个问题即数据冗余和二义性。这是因为在父类中声明了成员变量_。 对于和这两个类中分别继承了。对于分别继承了。因此在中存在着两个相同的成员变量_。对于这点也可以在监视窗口进行查看 由于存在着两个相同的成员变量因此造成了数据冗余。至于二义性。则体现在对于这个成员变量进行访问时所体现例如 通过上面给出的图片可以看出此时编译器并不知道需要访问的变量_是从哪个父类继承而来的因此造成了二义性。但是可以通过显式访问的方法来解决二义性问题即
int main()
{Student s;s.Professor::_ads 10;s.Teacher::_ads 15;return 0;
}
不过这种方式只能解决二义性问题不能解决数据冗余问题。
为了解决数据冗余的问题需要引入虚继承具体操作如下
class Person
{
public:int _ads;};class Professor : virtual public Person
{
protected:int _age;string _name;
};class Teacher1 : virtual public Person
{protected:int _tele;
};class Student : public Professor ,public Teacher
{
public:int _weight;
};
对于虚继承的使用原则下面给出一个例子用于说明 假设上图给出的结构代表一个继承体系根据上面对与数据冗余和二义性的介绍上图中在中存在两个类继承过来的内容从而造成数据冗余。在使用虚继承时造成数据冗余和二义性的源头上例如图中造成上述问题的源头是因为分别继承了一次。所以在加入虚继承时需要在继承以及继承时加上。