为什么C ++不使用父类构造函数?

时间:2014-12-07 14:30:31

标签: c++ inheritance constructor initialization

我想知道为什么在c ++中不能使用父类构造函数来获取特定签名,以防派生类错过它?

例如,在下面的示例中,我无法使用dd初始化std::string对象。

#include <iostream>


class Base
{
    int num;
    std::string s;
public:
    Base(int _num){ num = _num;}
    Base(std::string _s){ s = _s;}
};

class Derived : public Base {
public:
    Derived(int _num):Base(_num){}
};

int main()
{
    Base b(50);
    Derived d(50);
    Base bb("hell");
    Derived dd("hell"); // <<== Error
    return 0;
}

使用继承我希望扩展一个类而不会失去以前的功能,但在这里我感到失去了一些。

在一个更实际的示例中,我创建了std::string的版本,但在某些情况下它的行为不像std::string

#include <string>
#include <iostream>


class MyString: public std::string {
public:
    void NewFeature(){/* new feature implementation*/}
};

int main()
{
    MyString s("initialization");   // <<== Error: I expect to initialize with "..."
    cout<<s;                        // <<== Error: I expect to print it like this.
    return 0;
}

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:8)

如果您也想继承构造函数,则需要在代码中告诉编译器:

class Derived : public Base {
  public:
    using Base::Base;  // <- Makes Base's constructors visible in Derived
};

至于“为什么我需要这样做?”:便宜的答案是:因为标准是这样说的。

为什么这样做是猜测(如果你不问委员会成员自己)。他们很可能希望避免“令人惊讶”或“不直观”的代码行为。

答案 1 :(得分:0)

我没有足够的代表标记为重复,但Inheriting constructors已足够回答。

基本上,在C ++ 11之前,它是允许构造函数继承的标准。 C ++ 11改变了这一点,你现在可以继承构造函数。