使用语句和受保护的构造函数

时间:2019-04-30 19:42:52

标签: c++

If ie.document.querySelectorAll(".list-tabs--secondary").length > 0 Then
'championship tab present
'switch to main
    ie.document.querySelector("#sm-0-0 a").click 'or >
    ie.document.querySelector(".list-tabs--secondary a").click
Else
    'Championship tab is not present 
End If

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

似乎:

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

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

但是我不能对构造函数做同样的事情:无法通过'using'改变其可见性

为什么?

3 个答案:

答案 0 :(得分:4)

这是故意的。请注意,A::A继承了每个构造函数,而不仅是您期望的构造函数。将using的access修饰符应用于每个继承的构造函数可能会太遥不可及。相反,它只是使它们可用于过载解析。

来自cppreference

  

如果 using-declaration 引用的是所定义类的直接基础的构造函数(例如using Base::Base;),则该基础的所有构造函数(忽略成员访问)均可见初始化派生类时要重载解析。

     

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

如果要在构造A::A(int)时调用B,则可以自己实现B::B(int)以便调用它。

答案 1 :(得分:4)

来自cppreference

  

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

一个可能的理由是,构造函数通常具有不同的可访问性,这很关键,而using声明没有提供区分它们的方法,如果使用了使用时的可访问性,则它们将具有相同的可访问性。 / p>

答案 2 :(得分:1)

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

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