同名隐藏与赋值兼容规则:
编制派生类时可分四步 :
1.吸收基类的成员。不论是数据成员,还是函数成员,除构造函数与析构函数外全盘接收
2.改造基类成员。声明一个和某基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称为同名覆盖(override)
3.发展新成员。派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展。
4.重写构造函数与析构函数。
同名隐藏:
子类的同名函数隐藏了父类的所有同名函数,不管是参数的多少;
<span style="font-size:18px;">#include <iostream>
using namespace std;
class Base
{
public:
Base():x(0)
{}
~Base()
{}
public:
void Show()
{
cout<<"This is Base"<<endl;
}
void Show(int)
{
cout<<"This is Base Show(int)"<<endl;
}
private:
int x;
};
class D : public Base
{
public:
D():y(0)
{}
~D()
{}
public:
void Print()
{
cout<<"This is D"<<endl;
}
void Show()
{
cout<<"This is D Show()"<<endl;
}
private:
int y;
};
int main()
{
D d;
d.Print();
d.Show(); //子类和父类都有Show()方法,当子类调动Show()方法时,调动了自己的Show()方法,子类的Show()方法隐藏了父类的Show()方法
d.Show(0); //错误,当子类调动Show(int)方法时,因为子类中有它的同名函数Show()方法,子类的Show()方法隐藏了父类的Show(int)方法
return 0;
}
</span>
在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。
它包括以下情况:
1.派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的隐藏对象赋值给基类对象。
反过来不行,因为派生类的新成员无值可赋。
2.可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员。同样也不能反过来做。
3.派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的隐藏对象。
<span style="font-size:18px;">#include <iostream>
using namespace std;
class Base
{
public:
Base():x(0)
{}
~Base()
{}
public:
void Show()
{
cout<<"This is Base"<<endl;
}
void Show(int)
{
cout<<"This is Base Show(int)"<<endl;
}
private:
int x;
};
class D : public Base
{
public:
D():y(0)
{}
~D()
{}
public:
void Print()
{
cout<<"This is D"<<endl;
}
void Show()
{
cout<<"This is D Show()"<<endl;
}
private:
int y;
};
int main()
{
D d;
Base b;
b = d; //1.将派生类的对象赋值给其基类的对象,
d = b; //错误,父类对象不能给子类对象赋值
Base *pb;
pb = &d; //2.将派生类的地址赋给其基类的指针变量
pb->Show(); //可以访问父类的Show方法
pb->Print(); //错误,不可以访问子类的Print方法
Base &bf = d; //3.派生类对象可以初始化基类的引用
bf.Show(); //可以访问父类的Show方法
bf.Print(); //错误,不可以访问子类的Print方法
return 0;
}
</span>