C 11继承构造函数和访问修饰符

假设以下布局:

class Base
{
protected:
    Base(P1 p1, P2 p2, P3 p3);

public:
    virtual void SomeMethod() = 0;
}

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

public:
    virtual void SomeMethod() override;
};

我应该能够将 Derived 的构造函数指定为public吗? VC给出以下错误:

无法访问类'Derived'中声明的受保护成员编译器已在此处生成'Derived :: Derived'[指向使用Base :: Base行]请参阅'Derived'的声明

即它忽略了继承的构造函数之上的访问修饰符 .

这是该功能的限制吗?对于具有公共构造函数的 Base 类没有任何意义,因为它永远不能直接实例化(由于纯虚方法) .

回答(1)

2 years ago

根据12.9 / 4,"Inheriting constructors",当说 using X::X 时,

如此声明的构造函数具有与X中相应构造函数相同的访问权限 .

所以继承的构造函数也是 protected .