我有一个扩展Child
的课程Base
。在我的课程Foo
中,我的签名方法如下:
void Foo::doStuff(Base *& base); // case A
void Foo::doOther(Child *& child); // case B
void Foo::doSomething(Base * base); // case C
我对案例B 没有任何问题。 如果我写:
Child * myChild = new Child();
Foo foo;
foo.doOther(myChild);
没有编译/运行时错误。
问题在于案例A ,如果我写:
Child * test = new Child();
Foo foo;
foo.doStuff(test);
我收到编译时错误消息:
错误:没有匹配函数来调用foo :: doStuff ...
如果我没有使用对指针的引用( case C )
,则没有问题我还试图在调用Base *&
之前将测试对象强制转换为doStuff
对象,但我想让它像 case C 一样工作。< / p>
有什么想法吗?
编辑:
它是:Child * myChild = new Child(); //不是Base * myChild = new Child();
答案 0 :(得分:5)
如果这个
Child * test = new Child();
Foo foo;
foo.doStuff(test);
将被允许,doStuff
的实现方式如下:
Foo::doStuff(Base *& base)
{
delete base;
base = new Base();
}
然后你会得到一个静态输入为Child *
的指针,但实际上指的是Base
。
这个
Child * test = new Child();
Foo foo;
foo.doSomething(test);
不是问题,因为doSomething
无法修改test
。
答案 1 :(得分:0)
Child
“是”Base
这一事实并不意味着pointer-to-Child
“是”pointer-to-Base
。继承不会传播到指针,这是有充分理由的。
想象doStuff
实现如下:
void doStuff(Base *& base)
{
base = new Base;
}
如果你能够将一个指向Child
的指针传递给这个函数,你最终会得到一个指向错误类型对象的指针:
Child *pChild;
doStuff(pChild);
// pChild now points to a Base and not a Child!