传递对基类的指针的引用

时间:2013-04-10 14:37:57

标签: c++ pointers inheritance pass-by-reference

我有一个扩展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();

2 个答案:

答案 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!