【发布时间】:2018-11-23 00:27:25
【问题描述】:
我无法理解从基类继承构造函数的正确行为。 在我的特殊情况下,我有一个带有私有构造函数的 crtp-base 类,以防止基类(作为抽象类)的实例化。 现在,crtp-base 与派生类成为朋友,派生类使用 using 语句继承基类构造函数。这适用于默认、复制和移动构造函数,但对于自定义构造函数失败。有没有办法在不重新实现派生类中的所有构造函数的情况下实现这一点?
#include <iostream>
template <typename d_t>
class base
{
friend d_t;
base()
{
std::cout << "base: ctor()\n";
}
base(base const & other) = default;
base(base && other) = default;
base(int)
{
std::cout << "base: ctor()\n";
}
};
class derived: public base<derived>
{
public:
using base<derived>::base;
};
int main()
{
derived d{};
derived d1{d};
derived d2{std::move(d1)};
// derived d3{1}; //does not compile!
}
编辑
AFAIK cppreference 表示构造函数的可访问性不会被派生类中 using 声明的访问说明符更改,这与其他成员函数不同。但是我已经看到这种代码编译和运行,我不确定我是否正确理解了 using-declaration。 当然,我会进一步调查其他代码以了解发生了什么,但我想知道是否有隐藏的东西我可能会错过。
【问题讨论】:
-
friend d_t;看起来不对? -
@Yakk-AdamNevraumont 为什么?
-
_t在 POSIX 中保留? -
让派生类成为朋友并没有多大意义,因为通过将所有内容设为受保护而不是私有,您将获得几乎相同的效果。主要区别在于,如果您从派生类派生其他类,但鉴于您使用的是 CRTP 模式,情况可能并非如此。因此,最后,我认为您使用了错误的工具来完成这项工作。
-
@Phil1970 是的。我可以保护它。如果我理解en.cppreference.com/w/cpp/language/using_declaration 正确,那么它甚至不应该工作。只是我见过这种代码编译,我完全无法解释为什么?所以我想知道是否有一点我不知道是什么使这项工作有效。