【问题标题】:Prevent slicing while passing by value an object (inheritance)通过值传递对象时防止切片(继承)
【发布时间】: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 &amp; 或者更易读的 const * 到 @987654330 @ 作为f() 的参数。为什么要传值?
  • 不,声明为类的对象将始终是您无法将其变为子类的类。您是否有理由反对在此处使用参考资料?
  • 这当然是可能的(例如,通过向这些类添加一个间接层)......但没有多大意义。对我来说似乎是一个 XY 问题。你想完成什么?
  • @CSstudZ 你也缺少一个虚拟析构函数

标签: c++ inheritance copy-constructor pass-by-value object-slicing


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2016-08-10
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多