0

在我的 Windows Native C++ 库中,我有时在构造函数方面做得过火,而没有提供具有相同功能的实际方法(5-10 个额外的构造函数)。这使得基本扩展 C++ 类变得非常困难,因为没有适当的构造函数继承(无需重新声明它们并转发调用)

我使用 MSVC。 (是的,你想笑就笑!) 问题是:除了默认构造函数/复制构造函数之外,有没有办法继承构造函数using因为,如果有人决定扩展一个我滥用构造函数的类(不添加新属性和单一继承),那将是一场噩梦。

(示例代码)

class parent {
public:
    parent(){
        std::cout << __FUNCTION__ << ':' << __LINE__ << std::endl;
    }
    // a non-standard constructor
    parent(const std::nullptr_t&):parent(){
        std::cout << __FUNCTION__ << ':' << __LINE__ << std::endl;
    }
};

// adds nothing to parent but helper methods
// and maybe self-reliant properties with their own constructors
// so no constructor is required to initialize child class properties
class child: public parent {
public:
     // using parent::parent; // of no real use
    child(){
        std::cout << __FUNCTION__ << ':' << __LINE__ << std::endl;
    }
    // need to forward call
    child(const std::nullptr_t&):parent(nullptr){
        std::cout << __FUNCTION__ << ':' << __LINE__ << std::endl;
    }
};

这种多构造函数继承噩梦尤其发生在我构建我的基本 CRTP 类并且需要扩展它以构建我的默认类,然后允许其他人扩展和构建他们自己的变体同时保持可链接方法功能(父到子)的时候。

无论如何,在 MSVC中,using parent::parent不继承parent(const std::nullptr_t&). 是不是应该按照C++11标准?我应该期待这样的功能VC13吗?这将极大地影响我对这次公开重写的风格选择。

我还想知道为什么,因为C++11,他们没有弄清楚当我扩展单个类而不添加新属性时,它应该继承父级的默认行为(构造函数、赋值运算符等)。这很有意义……编译器可以弄清楚。

4

2 回答 2

3

根据Herb Sutter 在 //build 的演讲中的 VS2013 路线图,在不久的将来,继承构造函数不会出现在 VC++ 中:

VS2013 功能路线图

他们是“有计划的”。

于 2013-08-05T18:26:00.747 回答
2

委托/继承ctors:

parent(const std::nullptr_t&):parent() { /* ... */

这是一个委托 ctor [class.base.init]/6,而

using parent::parent;

根据 C++11 标准 [class.inhctor] 从父级继承 ctors(除了复制/移动 ctors)

问题是:除了使用 using 的默认复制构造函数之外,还有其他方法可以继承构造函数吗?

是的,对于 C++11。MSVC 还不支持,根据这个 MS 站点,VS2013 将支持委托 ctors(但没有提到继承 ctors)。

我还想知道为什么对于 C++11,他们没有弄清楚当我扩展单个类而不添加新属性时,它应该继承父级的默认行为

没有假设。您的派生类可能需要以不同方式初始化。继承 ctor 用一行代码解决了这个问题。


像第 3 版这样的东西是否有可能实现?

我知道这个问题,但我没有最新的草案和提案能够为 C++1y 回答这个问题。对于 C++11,AFAIK,这是不可能的 - 您可以使用宏来使其更短(但不一定更好):

#define EMPTY
#define DEF_MYCLASS_MEM(RET) template <typename tnChar> RET MyClass<tnChar>::
#define MYCLASS_TYPE typename MyClass<tnChar>

DEF_MYCLASS_MEM(EMPTY) MyClass() {}

DEF_MYCLASS_MEM(MYCLASS_TYPE::tString) Method1(const tString& aParam) const {
    return aParam;
}
于 2013-08-05T17:44:27.947 回答