c++用va_arg调用超类构造函数

c++ calling superclass constructor with va_arg

本文关键字:调用 超类 构造函数 arg va c++      更新时间:2023-10-16

我有一个基类,它包括一个带可变参数列表的构造函数:

class Super {
public:
    Super(int num, ...);
...
}

现在,在我的子类构造函数中,我需要以某种方式调用这个超类构造函数,但我该怎么做呢?通常的事情,自然,不起作用:

class Sub {
public:
    Sub(int num, ...) : Super(???) { ... }
...
}

那么我用什么来代替???

我确实有另一个接受向量的构造函数,但是有一个这样的构造函数是客户端的直接要求。

与任何变量函数一样,也始终提供列表版本:

void foo(int a, ...) { va_list ap; va_start(ap, a); vfoo(a, ap); va_end(ap); }
void vfoo(int a, va_list ap) { /* actual implementation */ }

相同:

#include <cstdarg>
struct Super
{
    Super(int num, ...) : Super(num, (va_start(ap_, num), ap_)) { va_end(ap_); }
    Super(int num, va_list ap);
private:
    va_list ap_;
};

您的派生类将执行相同的蒸发操作,然后使用超构造函数的列表形式。

如果仅仅为了构造而使用数据成员使您感到不安,并且您的类在其他方面是可复制或可移动的,那么您也可以放弃变量构造函数,而使用一个命名的静态成员函数来完成包包装。