傳遞對象和傳遞指針(是否產生多態)

今天碰到一個例子,這樣則是常見的多態行爲,一個接口,多種實現。

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);

結果是

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章