防止在按值传递对象(继承)时进行切片



据我所知,当对象在方法中按值传递时,将调用复制构造函数。

因此,如果我实现自己的复制构造函数,有没有办法避免在方法中按值传递对象时切片?

例:

// in headers file
// for A
class A
{ 
public :
virtual void Display() const
{ cout << "A::Display() was called << endl; }
};
// for B
class B : public A
{ 
public :
void Display() const
{ cout << "B::Display() was called << endl; }
//---> here I would created a copy constructer
};

在主文件中.cpp我这样做:

void f( A anA)
{
anA.Display();
}
int main() 
{
B anB; 
f ( anB );
return 0;
}

据我了解,完成此操作后,anB 被复制到 anA(方法 f 的形式参数(中:

f ( anB );

有没有办法让它输出"B::D isplay(( 被调用"(无需通过引用或使用指针传递(?

谢谢!

不,没有。当你宣布void f(A anA)f得到它自己的新鲜A.那里没有B

您可以通过删除A复制构造函数来防止切片。那么没有人可以切片呼叫f,因为没有人可以呼叫f