2

我有一个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...

如果我不使用对指针的引用(案例 C) ,则没有问题

Base *&在调用 to 之前,我还尝试将测试对象强制转换为对象doStuff,但我想让它像case C一样工作。

有什么想法吗?

编辑:

它是: Child * myChild = new Child(); //不是基础 * myChild = new Child();

4

2 回答 2

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.

于 2013-04-10T14:51:01.033 回答
0

Child“is-a”这一事实Base并不意味着pointer-to-Child“is-a” 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!
于 2013-04-10T14:51:34.527 回答