Я столкнулся с проблемой с моими классами, передав константный объект (полиморфную структуру) явному конструктору, который получает константную ссылку на базовый класс этой полиморфной структуры.
Вот пример (это не из моего кода, это для объяснения здесь)
class Base
{
...
}
class Derived:public Base
{
...
}
class Problem
{
Problem(const Base&);
...
}
void myFunction(const Problem& problem)
{
...
}
int main()
{
//explicit constructor with non const object
Derived d;
Problem no1(d); //this is working fine
myFunction(no1);
//implicit constructor with const object
Problem no2=Derived(); //this is working fine, debugged and everything called fine
myFunction(no2); //is working fine
//explicit constructor with const object NOT WORKING
Problem no3(Derived()); //debugger jumps over this line (no compiler error here)
myFunction(no3); //this line is NOT COMPILING at all it says that:
//no matching function for call to myFunction(Problem (&)(Derived))
//note: candidates are: void MyFunction(const Problem&)
}
Кажется, что он работает нормально со второй версией (явный вызов конструктора для задачи), только если я явным образом приведу объект Derived к его базовому классу Base, например:
Problem(*(Base*)&Derived);
Я не осознаю разницу между недвусмысленным и явным вызовом конструктора класса Problem.
Спасибо!