我想知道爲什麼在c + +不能使用父類的構造函數爲特定的簽名,萬一派生類錯過了?爲什麼C++不使用父類構造函數?
例如在下面的示例中,我無法使用std::string
初始化dd
對象。
#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;
}
有人可以給出一些解釋?
雖然'使用std :: string :: std :: string'不起作用,我需要'爲什麼'這個問題。爲什麼「繼承」在這裏聞起來。 – Emadpres 2014-12-07 14:36:44
@Emadpres請參閱[這裏](http://coliru.stacked-crooked.com/a/bc7ea27f32f4594c)瞭解'std :: string'的工作語法。 (幾乎是我在答案中寫的:) :) – 2014-12-07 14:45:29
我真的很驚訝。他們在這個標準中寫了一個特殊的例子,使得像'使用std :: string :: string'這樣的東西(回想一下'std :: string'實際上是'std :: basic_string'的一個特定類型的typedef ... ) – 2014-12-07 14:51:26