您的位置:首页 > 编程语言 > C语言/C++

C++继承与多态

2017-07-21 17:45 295 查看
1:分析菱形继承的问题。

2:剖析虚继承是怎么解决二义性和数据冗余的

首先,我们先来看一个菱形继承的程序。

#include<iostream>
using namespace std;

class Person
{
public:
string _name;
};

class Student : public Person
{
protected:
string _id;
}

class Teacher : public Person
{
protected:
string _num;
}

class Assistant : public Student,public Teacher
{
protected:
string _majorcourse;
}

void test()
{
//显示指定访问那个父类的成员
Assistant a;//
a.Student::_name = "xiaoke";
a.Teacher::_name = "keming";
}






为了解决以上问题,我们引入虚继承的语法。可以有效的解决菱形继承的数据冗余和二义性问题。

1.虚继承解决了菱形继承体系里子类对象包含多份父类对象的数据冗余问题和浪费空间的问题。

2.虚继承看起来复杂,但在实际应用中我们通常不会定义如此复杂的继承体系,一般不到万不得已不建议定义菱形结构的虚继承体系结构。因为使用虚继承解决数据冗余问题也带来了性能上的损耗。

clsaa Student : virtual public Person
{
protected:
char* id;
}
class Teacher : virtual public Person
{
protected:
char* _num;
}
class Assistant : public Student,public Teacher
{
protected:
char* _majorcourse;
}




2.剖析虚继承是怎么解决二义性和数据冗余的

在上述程序中,二义性表现在 在Assistant类中存在name对象,无法确定次name对象是Student的还是Teacher的。而在Assistant类中存在Student类和Teacher类的name对象相等的情况,即Assistant类中有另个含义相同的量,此为数据冗余。

class A
{
public:
int _a;
};

class B : virtual public A
{
public:
int _b;
};

class C: virtual public A
{
public:
int _c;
};

class D: public B, public C
{
public:
int _d;
};

int main()
{
D d;
d.B::_a = 0;
d.C::_a = 1;
d._b = 2;
d._c = 3;
d._d = 4;

return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: