继承public / protected / private构造函数

问题描述 投票:2回答:1

如果我理解正确:

class Base { /*...*/ };
class Derived: public Base { public: using Base::Base; }

将在Base强制执行所有Derived构造函数的继承。

但是公共/受保护/私人建设者呢?

class Base {
    friend void g();
public:
    Base (A a);
protected:
    Base (B b);
private:
    Base (C c);
};

class Derived: public Base {
public:
    using Derived::Derived;
};

我找不到任何关于此的规范,但我尝试了以下内容:

void f () {
    Derived{A{}}; // OK
    Derived{B{}}; // Inaccessible
    Derived{C{}}; // Inaccessible
}

void g () {
    Derived{A{}}; // OK
    Derived{B{}}; // OK
    Derived{C{}}; // OK
}

所以看来using Base::Base在决定继承哪些构造函数时(它继承了私有构造函数)并没有考虑访问修饰符,但是它继承了那些修饰符(私有/受保护的构造函数仍然无法被其他人访问)并且它允许私有/保护访问Base的朋友(友谊不是继承的,所以g不是Derived的朋友,但它仍然可以访问继承自DerivedBase的私人/受保护的构造函数)。

这是正确和标准的行为吗?

c++ inheritance constructor using access-modifiers
1个回答
1
投票

您正在寻找的规范是[namespace.udecl] ¶19,强调我的。

命名构造函数的using-declarator不会创建同义词;相反,如果在用于构造相应基类的对象时可以访问附加构造函数,则可以访问这些附加构造函数,并忽略using-declaration的可访问性。

您的测试与该段落一致。可访问性检查失败或完全按照在您检查的范围内构造Base时的方式进行检查。

© www.soinside.com 2019 - 2024. All rights reserved.