从派生类隐藏基类的实现细节

时间:2014-06-21 13:26:18

标签: c++ constructor

假设我们有一个基类A类和派生的B类:

struct A
{
    A(int a) : a(a) {}
    int a;
};

struct B : public A
{
    B(int a, int b) : A(a), b(b) {}
    int b;
};

有没有办法在不知道A类的情况下定义B类'构造函数?例如,工厂类可能负责 提供A类所需的数据,但B类的写者不必知道任何有关它的信息。 基本上假设我们没有委托构造函数,是否可以首先初始化对象的A类部分,然后使用另一组构造函数参数初始化B部分?

3 个答案:

答案 0 :(得分:2)

您可以使用可变参数模板化构造函数,该构造函数可以将其参数转发给基类 [1]

struct B : public A
{
    template<typename...Ts>
    B(int b, Ts&&...args) : A(std::forward<Ts>(args)...), b(b) 
    {
    }
    int b;
};

但除非 [2] 基类本身是一个通用方面,否则上述内容不会有任何实际用途,例如

template<typename Base>
struct B : public Base
{
    template<typename...Ts>
    B(int b, Ts&&...args) : Base(std::forward<Ts>(args)...), b(b) 
    { 
        // above the initialization of b (its related argument)
        // are not part of the variadic pack
    }
    int b;
};

Example


1。以上意味着相关的工厂方法也使用可变参数模板

2。只考虑一个想要构建其基础的类而不知道它构造的变量的数量或类型。用途可能因环境而异

答案 1 :(得分:0)

派生类需要查看它的基类的完整定义,所以不,你不能在没有A的定义(涉及它的构造函数)的情况下定义B.

如果你真的需要继承,你需要检查一下。如果你不是,那么A和B可以是单独的类(因此B不是A的派生类),你可以单独构造它们。然后例如你可以创建一个包含A和B成员的第三个类。

答案 2 :(得分:0)

您不能从不完整的类型继承。如果只是转发声明基类,则会出现编译时错误。例如,在gcc(我有4.8.1)中,您将收到invalid use of incomplete type错误。因此,如果该类将成为基类,则无法隐藏类声明。