如何继承一个带变参方法的类?附上我写的代码,请高手指点。

shi_hang_nk 中创软件昆山公司 副总工程师  2010-07-16 07:36:26
我试了如下方法来继承,但编译报错

class A{
public:
A(int i, char* pcszFormat, ...) {}
};

class B: public A
{
public:
B(int i, char* pcszFormat, ...) : A(i, pcszFormat, ...){}
};

1>d:\testcplusplus\testcplusplus.cpp(82) : error C2059: syntax error : '...'
1>d:\testcplusplus\testcplusplus.cpp(82) : error C2512: 'A' : no appropriate default constructor available
...全文
99 点赞 收藏 15
写回复
15 条回复
shi_hang_nk 2010年07月17日
va_start会在父类里重新初始化va_list,所以要去掉。
回复 点赞
程序漫步 2010年07月16日
学习了 ~~·~~
回复 点赞
mymtom 2010年07月16日
[Quote=引用 10 楼 shi_hang_nk 的回复:]

谢谢各位参与。我已经解决了,在A的构造函数里去掉va_start就可以了。
[/Quote]
这个方法似乎不对啊,难道一定需要一个va_list的构造函数?

#include <iostream>
#include <cstdarg>

class FOO
{
public:
FOO() {}
FOO(const char *fmt, va_list ap)
{
vprintf(fmt, ap);
}
FOO(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
FOO(fmt, ap);
va_end(ap);
}

};

class BAR : public FOO
{
public:
BAR() {}
BAR(const char *fmt, va_list ap) : FOO(fmt, ap)
{
}
BAR(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
BAR(fmt, ap);
va_end(ap);
}
};

int main(void)
{
BAR bar("%s:%d\n", __FILE__, __LINE__);
return 0;
}
回复 点赞
太乙 2010年07月16日
[Quote=引用 10 楼 shi_hang_nk 的回复:]

谢谢各位参与。我已经解决了,在A的构造函数里去掉va_start就可以了。
[/Quote]为什么要去掉??用的很对啊,就要va_start
回复 点赞
mymtom 2010年07月16日
我仔细查了一下,只有用g++ -O2 编译才正常输出。
看来BAR(const char *fmt, ...) : FOO(fmt)的写法是有问题的。
回复 点赞
shi_hang_nk 2010年07月16日
谢谢各位参与。我已经解决了,在A的构造函数里去掉va_start就可以了。
回复 点赞
shi_hang_nk 2010年07月16日
to mymtom:

我试了一下你的方法,输出的是乱码呀。你执行正常吗?
回复 点赞
mymtom 2010年07月16日

#include <iostream>
#include <cstdarg>

class FOO
{
public:
FOO(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
};

class BAR : public FOO
{
public:
BAR(const char *fmt, ...) : FOO(fmt)
{
}
};

int main(void)
{
BAR bar("%s:%d", __FILE__, __LINE__);
return 0;
}
回复 点赞
shi_hang_nk 2010年07月16日
Hi mstlq,

执行的结果不对呀

class A{
public:
A(){}
A(int i, char* fmt, ...)
{
va_list args;
va_start(args, fmt);
char* szBuffer = new char[100];
vsprintf(szBuffer, fmt, args );
va_end(fmt);

cout<<i<<endl;
cout<<szBuffer<<endl;
}
};

class B: public A
{
public:
B(int i, char *fmt, ...) : A(i, fmt){}
};


int main(int argc, char* argv[])
{
B b(1, "%s %d", "aaaa", 123);
return 0;
}

执行后输出 :
1
`? 0
第2个cout输出乱码,似乎是调用A的构造函数,没有输入args。
回复 点赞
pgplay 2010年07月16日
我还以为要另外为A定义一个用va_list的构造函数呢,学习了
回复 点赞
yunyun1886358 2010年07月16日
还能这样写,学习了。
回复 点赞
liutengfeigo 2010年07月16日
求一篇博客详细介绍这东西的
回复 点赞
liutengfeigo 2010年07月16日
C++也可以而加....?
回复 点赞
mstlq 2010年07月16日
这样……

class A
{
public:
A(int i, char* pcszFormat, ...) {}
};

class B: public A
{
public:
B(int i, char* pcszFormat, ...) : A(i, pcszFormat) {}
};
回复 点赞
justinlm 2010年07月16日
你没有给A类和B类写默认的构造函数,
一般类必须有吧!
如果你不想让A能创建默认的实例,那你就的把默认的无参的构造函数设为私有的
这样就行了。
还有你代码中参数有...不行吧
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告