#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,可变参数有更好的模板支持,后面环境支持,再试一下。