封裝,繼承,多态是面向對象的三大特性。每一種特性,都有很多細節知識點。在這裡,我們主要介紹一下繼承中的同名隐藏和指派相容規則。
同名隐藏:隻要子類中的函數名與父類函數名相同,子類中的函數将會隐藏所有父類和子類同名的函數,隻要名字相同就可以,不管參數清單。注意與函數重載的差別。
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
class A
{
public:
A() {}
~A() {}
void setStr(string str)
{
cout<<"class A"<<endl;
}
};
class B : public A
{
public:
B() {}
~B() {}
void setStr(char ch)
{
cout<<"class B:"<<"char"<<endl;
}
void setStr(double d)
{
cout<<"class B:"<<"double"<<endl;
}
};
int main()
{
B b;
b.setStr('A'); // 1
b.setStr(12.120); //2
b.setStr("helloWorld"); //3
b.A::setStr("helloWorld"); //4
return 0;
}
在上述代碼中,标号1和2 的行 會按照函數重載的規則正确運作。 标号3則出錯。 因為 父類A中的函數被隐藏,在子類B中沒有可以處理string類型的相應函數。
如果想要使用父類A中的函數,則可以按照 标号4 的方式。
指派相容規則:
概念:在任何需要基類對象的地方都可以使用公有的派生類對象來替代。
在共有繼承方式下,指派相容規則規定:
(1)派生類對象可以指派給基類的對象,這個時候派生類的對象中,從對應基類中繼承來的隐藏部分指派給基類對象
(2)派生類對象的位址值可以指派給基類的對象指針,但隻能通過這個指針通路派生類中由基類繼承來的隐藏對象,不能通路派生類中的新成員
(3)派生類對象可以用來給基類對象引用初始化,但這個引用隻能包含派生類對象中由基類繼承來的隐藏對象
使用上述規則,必須注意兩點:
(1)必須是公有繼承
(2)上述條件不可逆