如何解决是否可以在cpp> = 11中使用继承继承私有构造函数
是否可以使用using语句继承私有构造函数? 我尝试添加一个朋友声明,但似乎没有用。
struct B;
struct A
{
private:
A(int x) {}
A(int y,double z) {}
friend struct B;
};
struct B : public A
{
public:
using A::A;
//B(int x) : A(x) {}
//B(int x,int y) : A(x,y) {}
};
void demo()
{
B b1(5); // does not compile - implicit constructor is not accessible
B b2(4,9.0);
}
我想知道是否有任何方法可以使用它,因为如果我明确创建委托的构造函数,则Friend语句可以正常工作,因此这是不一致的:
struct B;
struct A
{
private:
A(int x) {}
A(int y,double z) {}
friend struct B;
};
struct B : public A
{
public:
B(int x) : A(x) {} // OK
B(int x,y) {}
};
void demo()
{
B b1(5); // OK
B b2(4,9.0);
}
解决方法
继承的构造函数的可访问性不受引入它们的using声明的可访问性的影响。
[namespace.udecl] (强调我的意思)
19使用声明创建的同义词通常 成员声明的可访问性。命名的使用声明符 构造函数不会创建同义词;相反,其他 构造函数是可访问的,如果它们习惯于 构造相应基类的对象,然后 使用声明的可访问性将被忽略。
由于您无法在A
中访问main
的构造函数,因此也无法在B
中构造main
(您可以出于友情考虑,使用它来在B
的范围内构造A
和B
)。您需要为外部访问明确地阐明某种转发条件。由于您似乎追求了“包罗万象”的特性,因此可以使用一个非常简单的解决方案
template<typename... Args>
B(Args&&... args) : A(std::forward<Args>(args)...) {}
,
我想知道是否有任何方法可以使用
using
,因为如果我显式创建委托构造函数,那么friend
语句就可以工作
否,当using
是基类构造函数时,它们将保留原始的protected
或private
访问权限,因此,如果您想在派生类中实现它们,使它们成为public
。将B
设为friend
不会改变这一点。它仅允许B
访问A
中的私有成员-函数和变量。
如果您希望派生类能够使用某些private
成员函数,则通常改为使用这些成员函数protected
。
struct A {
protected:
A(int x) {}
A(int y,double z) {}
};
struct B : public A {
public:
B(int x) : A(x) {}
B(int y,double z) : A(y,z) {}
};
有了这个,您在设计A
时就不需要了解派生类,并且还可以将private
成员变量保留在A
private
中。
基于@StoryTeller-Unslander Monica的回答,它解释了(继承的)构造函数在基类构造函数所在的位置都可以访问,这是一个非常局部的解决方案,在某些情况下可以使用:
struct A
{
private:
A(int x) {};
A(int y,double z) {};
friend struct B;
};
struct B : public A
{
public:
friend void demo();
using A::A;
};
void demo()
{
B b1(5);
B b2(4,9.0);
}
int main() {
demo();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。