繁体   English   中英

继承构造函数与转发

Inheriting constructors vs forwarding

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

C ++ 11允许继承构造函数,从而可以避免大量的样板,尤其是类似于包装类的东西。 但是,似乎您已经可以使用可变参数模板实现此功能。

class B
{
public:
 B(int){//do something}
 B(int, char){//do something}
};

使用继承构造函数:

class D : public B
{
public:
 using B::B; 
};

使用可变参数模板并转发:

class D : public B
{
public:
 template <typename...Args>
 D(Args&&... args) : B(std::forward<Args>(args)...)
 {
 }
};

虽然一致性(对待构造函数和方法的相同方式using )和易用性很好的理由把继承构造成的语言,还有没有其他原因的第一个解决方案应首选第二? 我发现讨论继承构造函数的CWG文档( N1890N1898 )只是注意以下内容并继续:

仅仅是一个历史事故阻止使用它来为构造函数和普通成员函数工作。 如果构造函数被称为“ctor”或“构造函数”而不是被其类的名称引用,那么这将起作用。 我们建议将其作为继承构造函数的机制。

3 个回复

最重要的原因是完美转发并不完美。 简单案例:

struct B {
    B(int* ) { .. }
};

现在考虑:

D d{0};

如果我们继承构造函数,这很好。 如果我们完美转发,我们将尝试构造B(int ) ,因为0推导为int ,这是一个不存在的构造函数。 失败!

其他故障情况包括支撑初始化,仅声明的静态const数据成员,重载函数和位域。

完美转发并不完美。 特别是,0作为实际参数减少为int而不是表示一般的nullvalue。 因此,对于构造函数采用指针参数, 0将作为继承构造函数的实际参数,但不用于转发。

我认为我曾经提到的另一个原因是,问题(我们真的需要继承构造函数)是否被播出,继承构造函数是一个简单的符号,用于概念上简单的事情,用于简单类的上下文中。 在C ++中有足够的强制复杂性和强制样板。

维护问题(编译器错误)可能会导致'使用'的偏好:

struct Base
{
    Base(int) {}
};

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

struct DerivedTemplate : Base
{
    template <typename...Args>
    DerivedTemplate(Args&&... args)
    : Base(std::forward<Args>(args)...)
    {}
};

int main()
{
    // error: no matching function for call to ‘Derived::Derived(int, int)’
    Derived d(1, 2);

    // In instantiation of ‘DerivedTemplate::DerivedTemplate(Args&& ...) [with Args = {int, int}]’:
    // required from here
    // error: no matching function for call to ‘Base::Base(int, int)’
    DerivedTemplate dt(1, 2);
}

此外,每个模板实例化都是一个不同的构造函数(使用时不会相乘)

2 我可以继承构造函数吗?

我知道在 C# 中继承构造函数是不可能的,但可能有一种方法可以做我想做的事情。 我有一个由许多其他类继承的基类,它有一个Init方法,可以使用 1 个参数进行一些初始化。 所有其他继承类也需要初始化,但我需要为所有这些类创建单独的构造函数,就像这样: 这完全违反了 DRY 原则! 如何在不创建 ...

2010-10-06 14:08:15 6 81737   c#/ dry
3 关于继承和构造函数

我只是想知道我在某些信息中找到的这段代码是否正确。 我发现很奇怪,两个示例中都使用了两次直径,这真的正确吗? ...

2012-06-06 06:19:15 4 100   c#
4 如何继承构造函数?

想象一下具有许多构造函数和虚方法的基类 现在我想创建一个覆盖虚方法的后代类: 而另一个后代做了更多的东西: 我是否真的必须将所有构造函数从Foo复制到Bar和Bah? 然后,如果我在Foo中更改构造函数签名,我是否必须在Bar和Bah中更新它? 有没有办法继承构造 ...

5 构造函数继承

我希望B自动从A继承构造函数,而不必像下面这样显式实现它们: 我该如何实现? ...

2014-09-02 18:18:59 4 73   java
6 构造函数和继承

让我们在C#中举个例子 现在,除了构造函数之外,Foo的所有公共成员都可以在Bar中访问。 我做不了类似的事情 为什么构造函数不可继承? UPDATE 我知道我们可以链接构造函数,但我想知道为什么上面的构造无效。 我相信它应该是有正当理由的。 ...

7 继承和构造函数

这不是家庭作业,只是我的C ++类的一些培训练习,目的是习惯于继承和学习东西。 因此,练习的第一部分要求我们创建一个名为Rectangle的类的程序,并应该执行构造函数的getter和setter的操作,并找到面积和周长。 练习的第二部分说要创建一个新的类名称Square,该类扩展Recta ...

9 构造函数和继承

我到处都读到: 构造函数不会从基类继承到派生类 如果这是真的,那么 创建派生类的对象时,如何调用基类的默认构造函数? 例如 : ...

2014-09-27 19:52:52 3 100   c#
10 为什么构造函数不是继承的?

我一直在使用Eclipse Juno学习继承中的构造函数。 当我在childClass中按两次ctrl + O时,它显示继承的成员。 但我碰巧在继承的成员中甚至看到超类的构造函数 但据说构造函数不是继承的...... 有人可以解释一下这种行为吗? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM