Мне интересно, почему в С ++ нельзя использовать конструктор родительского класса для конкретной сигнатуры, если этот производный класс пропустил это?
Например, в примере ниже я не могу инициализировать объект 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;
}
Может кто-нибудь дать объяснение?