【发布时间】:2019-08-24 21:41:09
【问题描述】:
如果我理解正确:
class Base { /*...*/ };
class Derived: public Base { public: using Base::Base; }
将强制继承Derived 中的所有Base 构造函数。
但是公共/受保护/私有构造函数呢?
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 的朋友,但它仍然可以访问从Base 继承的Derived 的私有/受保护构造函数)。
这是正确和标准的行为吗?
【问题讨论】:
标签: c++ inheritance constructor using access-modifiers