【c++】多继承

来源:互联网 发布:维多利亚服饰知乎 编辑:程序博客网 时间:2024/05/16 15:26

一、多继承格式:

class<派生类名>:<继承方式><基类名1>,....,<继承方式><基类名n>

{

<定义派生类自己的成员>

}

二、多继承引发的问题

二义性和支配规则
出现二义性的两种情况

1、调用不同基类的相同成员可能出现二义性

即两个基类中成员函数具有相同的名字

比如下列程序:

#include<iostream>
using namespace std;


class Basecalss1
{
public:
void seta(int x)
{
a=x;
}
void show()
{
cout<<"a="<<a<<endl;
}
private:
int a;
};
class Basecalss2
{
public:
void setb(int x)
{
b=x;
}
void show()
{
cout<<"b="<<b<<endl;
}
private:
int b;
};
class Derivedclass : public Basecalss1,public Basecalss2
{


};


int main()
{
Derivedclass obj_d;
obj_d.seta(5);
obj_d.show();
obj_d.seta(2);
obj_d.show();
}

解决方式:

使用作用域运算符

int main()
{
Derivedclass obj_d;
obj_d.seta(5);
//obj_d.show();
obj_d.Basecalss1::show();
obj_d.setb(2);
//obj_d.show();
obj_d.Basecalss2::show();
}

2、访问共同基类的成员时可能出现二义性

#include<iostream>
using namespace std;


class Base
{
protected:
int val;
};
class Baseclass1:public Base
{
public:
void seta(int x)
{
val=x;
}
};
class Baseclass2:public Base
{
public:
void setb(int x)
{
val=x;
}
};


class Derivedclass:public Baseclass1,public Baseclass2
{

public:
void show()
{cout<<"val"<<val<<endl;}
};
int main()
{
Derivedclass obj_d;
obj_d.seta(5);
obj_d.show();
obj_d.setb(10);
obj_d.show();
}

解决方式:
1.利用虚基类

class Baseclass1:virtual public Base
class Baseclass2:virtual public Base

此时Bassclass1和Bassclass2共享基类Base的同一个单独共同对象

2.使用作用域运算符

void show()
{cout<<"val"<<Baseclass1::val<<endl;}



0 0
原创粉丝点击