您確定這個問題沒有寫顛倒嗎?
我記得大家都問為什麼子類例項可以傳給父類形參,因為子類例項包含了父類的定義,可以認為子類擁有的屬性、方法大於等於父類,所以透過父類形參訪問其屬性和方法,都可以在子類例項中找的到。
虛擬碼如下:
class A
{
public int m_a;
}
class B : public A
public int m_b;
父類A有屬性m_a;
子類B繼承父類A,又增加了屬性m_b;
假設有兩個函式定義為:
void testA(A paramA)
print(paramA.m_a); //這句正確
//print(paramA.m_b): //這句不正確,註釋掉了
void testB(B paramB)
print(paramB.m_a); //這句程式碼正確
print(paramB.m_b); //這句程式碼也正確
testA函式內paramA.m_b在常規的程式語言中是訪問不到的,有些IDE會直接提示語法錯誤;因為paramA的型別是A,父類A中沒有定義m_b。
testB函式內paramB.m_a可以訪問,因為paramB的型別是B,人家從老爹那裡繼承來的。
再看怎麼呼叫,先定義兩個例項:
A a;
B b;
testA(a); //這句正確
testA(b); //這句也正確,子類例項傳給父類形參
testB(a); //這句不正確,例項a中沒有定義m_b
testB(b); //這句正確
您確定這個問題沒有寫顛倒嗎?
我記得大家都問為什麼子類例項可以傳給父類形參,因為子類例項包含了父類的定義,可以認為子類擁有的屬性、方法大於等於父類,所以透過父類形參訪問其屬性和方法,都可以在子類例項中找的到。
虛擬碼如下:
class A
{
public int m_a;
}
class B : public A
{
public int m_b;
}
父類A有屬性m_a;
子類B繼承父類A,又增加了屬性m_b;
假設有兩個函式定義為:
void testA(A paramA)
{
print(paramA.m_a); //這句正確
//print(paramA.m_b): //這句不正確,註釋掉了
}
void testB(B paramB)
{
print(paramB.m_a); //這句程式碼正確
print(paramB.m_b); //這句程式碼也正確
}
testA函式內paramA.m_b在常規的程式語言中是訪問不到的,有些IDE會直接提示語法錯誤;因為paramA的型別是A,父類A中沒有定義m_b。
testB函式內paramB.m_a可以訪問,因為paramB的型別是B,人家從老爹那裡繼承來的。
再看怎麼呼叫,先定義兩個例項:
A a;
B b;
testA(a); //這句正確
testA(b); //這句也正確,子類例項傳給父類形參
testB(a); //這句不正確,例項a中沒有定義m_b
testB(b); //這句正確