【发布时间】:2020-04-06 14:13:28
【问题描述】:
据我了解,当对象在方法中按值传递时,会调用 Copy Constructer。
如果我实现自己的 Copy Constructer,当我在方法中按值传递对象时,有没有办法避免切片?
例子:
// 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
};
在 main.cpp 文件中我这样做:
void f( A anA)
{
anA.Display();
}
int main()
{
B anB;
f ( anB );
return 0;
}
据我了解,完成后,anB 被复制到 anA(方法 f 的形式参数)中:
f ( anB );
有没有办法输出“B::Display() 被调用”(不通过引用传递或使用指针)?
谢谢!
【问题讨论】:
-
没有。如果要按值传递,则需要从
f()中的A构造B。但这很尴尬,因为您确实有B开头...您确实有该方法 virtual 所以要使用它,您至少需要使用const &或者更易读的const *到 @987654330 @ 作为f()的参数。为什么要传值? -
不,声明为类的对象将始终是您无法将其变为子类的类。您是否有理由反对在此处使用参考资料?
-
这当然是可能的(例如,通过向这些类添加一个间接层)......但没有多大意义。对我来说似乎是一个 XY 问题。你想完成什么?
-
@CSstudZ 你也缺少一个虚拟析构函数
标签: c++ inheritance copy-constructor pass-by-value object-slicing