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

Prevent slicing while passing by value an object (inheritance)

提问人:CSstudZ 提问时间:12/13/2019 更新时间:12/13/2019 访问量:84

问:

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

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

例:

// 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::D isplay() was called”(不通过引用传递或使用指针)?

谢谢!

C++ 继承 复制构造函数 Pass-by-value 对象切片

评论

0赞 Resurrection 12/13/2019
没有。如果要按值传递,则需要从 中构造。但这很尴尬,因为你必须从......您确实有该方法,因此要使用它,您至少需要使用或可能更具可读性作为 的参数。为什么要按值传递?BAf()Bconst &const *Af()
0赞 Alan Birtles 12/13/2019
不,声明为类的对象将永远是您无法将其放入子类的类。你反对在这里使用引用有什么理由吗?
0赞 Daniel Jour 12/13/2019
这当然是可能的(例如,通过向这些类添加一层间接)......但没有多大意义。对我来说似乎是一个 XY 问题。你想完成什么?
0赞 Moia 12/13/2019
@CSstudZ你也缺少一个虚拟析构函数

答:

0赞 Caleth 12/13/2019 #1

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

您可以通过删除 s copy 构造函数来防止切片。那么就没人可以切片了叫,因为没人可以叫。Aff