#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,可變參數有更好的模板支持,後面環境支持,再試一下。