C++多態與可變參數混搭的奇妙之處

#include <string>
#include <stdarg.h>

class A
{
public:
	A(){}
	~A(){}
	virtual void fun(int n, ...)
	{
		printf("A.fun\n");
	}
	virtual void fun1(int n)
	{
		printf("A.fun1\n");
	}
};

class B : public A
{
public:
	void fun(int n, ...)
	{
		va_list args;
		va_start(args, n);
		char *para = NULL;
		para = va_arg(args, char *);
		char *p = (char *)para;
		printf("B.fun %s\n", p);
		va_end(args);
	}
	void fun1(int n)
	{
		printf("B.fun1\n");
	}
};

class C : public A
{
public:
	void fun(int n, ...)
	{
		va_list args;
		va_start(args, n);
		char *para = NULL;
		para = va_arg(args, char *);
		int *p1 = (int *)para;
		para = va_arg(args, char *);
		int *p2 = (int *)para;
		printf("C.fun %d %d\n", *p1, *p2);
		va_end(args);
	}
	void fun1(char c)
	{
		printf("C.fun1\n");
	}
};

int main(int, char**)
{
	A* b = new B();
	b->fun(1, "hello");//這裏
	b->fun1(1);

	int num = 9;
	A* c = new C();
	c->fun(1, &num, &num);//還有這裏,爲啥多態神奇的支持了!?
	c->fun1(1);//當然了,多態在這裏理所應當地失效了。

	delete b;
	delete c;
	return 0;
}

執行結果:

B.fun hello
B.fun1
C.fun 9 9
A.fun1
Press any key to continue

換句話說,利用可變參數,可一定程度上解決多態參數的瓶頸,看具體使用場景了。

在C++11,可變參數有更好的模板支持,後面環境支持,再試一下。

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