【发布时间】:2010-02-03 10:00:00
【问题描述】:
我的类遇到了问题,将一个 const 对象(多态结构)传递给一个显式构造函数,该构造函数接受对该多态结构的基类的 const 引用。 这是示例(这不是我的代码,这里是为了解释)
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 类的构造函数之间的区别。 谢谢!
【问题讨论】:
-
您在第二类声明中切换了“Base”和“Derived”。那是错字吗?此外,即使您在没有优化的
Debug配置文件中编译,“调试器跳过此行”注释是否也适用? -
您正在创建基类的对象并传递它们——您不会获得多态行为。您需要引用或指向基类的指针来获得所需的行为。投射不是解决方案。
-
参数是const引用,所以有多态行为的引用。
标签: c++ constructor explicit