【问题标题】:using statement and protected constructor [duplicate]using 语句和受保护的构造函数
【发布时间】:2019-04-30 19:42:51
【问题描述】:
class A {
protected:
    A(int) {}
};

struct B : public A {
public:
    using A::A;
};

void print(B b) {}

int main(int argc, char** argv) {
    print(1);
    return 0;
}

此代码无法编译...即使在 struct B 公共部分中使用“使用 A::A”,B 仍然没有接受 int 的公共构造函数(但它有一个受保护的构造函数)。

看来:

我可以用'using'继承公共构造函数

我可以在派生类中将基类中定义的任何方法(私有或受保护或其他)重新声明为公共

但是我不能对构造函数做同样的事情:没有办法用“使用”来改变它的可见性

为什么?

【问题讨论】:

  • 因为这是指定语言的方式。

标签: c++


【解决方案1】:

这是故意的。请注意,A::A 继承了 every 构造函数,而不仅仅是您期望的构造函数。将using 的访问修饰符应用于每个继承的构造函数可能影响深远。相反,它只是让它们可用于重载解析。

来自cppreference

如果 using-declaration 引用了正在定义的类的直接基类的构造函数(例如using Base::Base;),则该基类的所有构造函数(忽略成员访问)对重载可见初始化派生类时的分辨率。

如果重载决议选择了一个继承的构造函数,如果它在用于构造相应基类的对象时是可访问的,则它是可访问的:引入的 using 声明的可访问性它被忽略

如果你想在构造B时调用A::A(int),你可以自己实现B::B(int),让它调用它。

【讨论】:

    【解决方案2】:

    如果using 声明的当前访问说明符更改了“继承”构造函数的访问说明符,那么单独的“继承”构造函数将无法具有不同的访问说明符。

    如果基类确实有多个具有不同访问权限的构造函数,那么通常希望可访问性保留在派生类中。 using 的规则使这成为可能。

    【讨论】:

      猜你喜欢
      • 2016-04-07
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 2010-12-16
      • 2015-08-12
      • 2010-11-08
      相关资源
      最近更新 更多