今天碰到一個例子,這樣則是常見的多態行爲,一個接口,多種實現。
class A {
public:
virtual void fun()
{
cout << "1" << endl;
}
};
class B:public A {
public:
virtual void fun()
{
cout << "子類" << endl;
}
};
static void change(A *a)
{
a->fun();
}
int main()
{
A *a=new A;
B *b=new B;
change(a);
change(b);
}
結果自然是
將代碼改成引用則是(底層一樣)
class A {
public:
virtual void fun()
{
cout << "1" << endl;
}
};
class B:public A {
public:
virtual void fun()
{
cout << "子類" << endl;
}
};
static void change(A &a)
{
a.fun();
}
int main()
{
//A *a=new A;
//B *b=new B;
A a;
B b;
change(a);
change(b);
}
答案同上,依然是多態行爲,引用(指針)去尋找虛函數表。
但是如果改成對象參數,則只是普通對象實例化函數調用,實則是父類和子類的兼容性質問題。
//但是如果改成對象參數,則只是普通對象實例化函數調用
class A {
public:
virtual void fun()
{
cout << "1" << endl;
}
};
class B:public A {
public:
virtual void fun()
{
cout << "子類" << endl;
}
};
static void change(A a)
{
a.fun();
}
int main()
{
//A *a=new A;
//B *b=new B;
A a;
B b;
change(a);
change(b);
結果是
: