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)函数?
传递给非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)
你不能这样做,原因如下。假设它被允许并且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. 轰隆隆!