我想知道为什么在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;
}
有人可以解释一下吗?
答案 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改变了这一点,你现在可以继承构造函数。