文章目录
⼆义性问题
在多继承时,基类与派⽣类之间或基类之间出现,当一个派生类继承多个父类,如果多个父类中存在同名成员,此时派生类对象在调用该同名成员时所出现访问的不确定性 这个叫二义性问题
c
class A{
public:
void f();
};
class B{
public:
void f();
void g();
};
class C:public A,public B
{
public:
void g();
void h();
};
如果定义 C c1; 则c1.f()具有⼆义性问题,c1.g()⽆⼆义性问题(同名隐藏)
当派生类的成员与父类的成员出现重名,此时派生类对象在调用该重名成员时,优先调用派生类的
解决方法:
- 在派生类中对多个父类中的同名方法进行重写
- 派生类对象在调用父类的同名方法时,在方法名前加父类名做个限定
基类与派⽣类的转换
不同类型数据之间在⼀定的条件下可以进⾏类型的转换,⽐如可以把⼀个整数类型赋值给float类型,但是不能把整数类型赋值给指针类型。这种不同类型之间的⾃动转换和赋值称为赋值兼容。
基类与派⽣类型对象之间也有赋值兼容关系,因为派⽣类中包含从基类继承的成员,因此可以将派⽣类的值赋值给基类对象
示例:
c
class per
{
public:
string name;
int age;
void run()
{
cout<<name<<age;
}
};
class stu:public per
{
public:
int stu_id;
string class_name;
stu()
{
name="ljs";
age=12;
stu_id=1000;
}
};
int main()
{
per a;
stu s;
a=s;
a.run();
return 0;
}
//所谓的赋值只是对数据成员赋值,对成员函数不存在赋值问题。
//赋值后不能试图通过a去取访问派⽣类对象s的成员
小贴士:
只能⽤⼦类对其基类对象赋值,⽽不能使⽤基类对象对其⼦类赋值。因为基类对象不包含派⽣类成员,另外对于同⼀基类的不同派⽣类对象之间不能赋值。
如果函数的参数是基类对象或基类对象的引⽤,函数调⽤时的实参可以是派⽣类对象。(在实现动态多态中较为常⻅)