无法从'DerivedClass*'转换为'BaseClass*&'

use*_*020 4 c++ polymorphism reference pass-by-reference upcasting

我尝试以下代码,并获得编译错误.

class A {};
class B : public A {};

void f(A*& p) {}

int
main()
{
    B* pB;
    f(pB); // cannot convert argument 1 from 'B *' to 'A *&'

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何解决f(pB)调用f(A*&p)函数?

Rem*_*eau 5

传递给非const引用的指针变量必须与引用相同的数据类型匹配.该函数期待对A*指针的引用,这是您必须提供的.如果你有一个B*开头的指针,首先将它分配给一个A*变量(因为B派生自A):

B* pB = ...;
A* pA = pB;
f(pA);
Run Code Online (Sandbox Code Playgroud)

但如果函数修改它传递的指针,它会修改pA不会pB.如果您需要修改它pB,您将不得不重新考虑您的设计.

如果您有资格作为参数const,从而保证f不会修改它,那么就没有问题:

void f(A* const & p) { /* Compiles fine */ }
Run Code Online (Sandbox Code Playgroud)

  • "传递给引用的变量必须与引用匹配相同的数据类型",这在继承的情况下是不正确的 (2认同)

dlf*_*dlf 5

你不能这样做,原因如下。假设它被允许并且f()看起来像这样:

void f(A*& p) { p = new A(); }
Run Code Online (Sandbox Code Playgroud)

现在你这样做:

B* pB;
f(pB);
Run Code Online (Sandbox Code Playgroud)

返回时f()pB将指向一个A. 轰隆隆!