首页 > 解决方案 > 通过值传递对象时防止切片(继承)

问题描述

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

因此,如果我实现自己的 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() 被调用”(不通过引用传递或使用指针)?

谢谢!

标签: c++inheritancecopy-constructorpass-by-valueobject-slicing

解决方案


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

A您可以通过删除s 复制构造函数来防止切片。那么没有人可以对调用进行切片f,因为没有人可以调用f


推荐阅读