在 C++ 的继承上下文中按值传递 object

Pass by value an object in context of inheritance in C++

我正在学习 C++,在我老师的课程中,他解释说多态与按值传递不兼容。

他解释说,当你将一个 object 按值传递给一个方法时,编译器会在堆栈中生成一个 object 的副本,出于优化原因,他选择创建一个副本parent class 的类型。

例如,假设我有一个名为 A 的 class,而 class B 是 A 的 child class。 如果我按值传递类型 B 的 object,编译器会在堆栈上创建它的副本,但类型为 A。

我的问题是:

谢谢!

编辑:示例

// 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; }
};

现在在另一个名为 main.cpp:

的文件中有 3 种可能的情况

案例 1:

void f( const A & anA)
{
    anA.Display();
}

int main() 
{
    B anB;
    f (anB);
    return 0;
}

案例2:

void f( const A * anA)
{
    anA->Display();
}

int main() 
{
    A * anB = new B; 
    f ( anB );
    return 0;
}

案例 3:

void f( A anA)
{
    anA.Display();
}

int main() 
{
    B anB; 
    f ( anB );
    return 0;
}

据我了解,案例 1 和案例 2 将显示所需的输出(意思是 "B::Display() was called"),而案例 3 不会(它将输出:"A::Display() was called"),即使Display 方法在 A class.

中指定为虚拟方法

情况(1)通过引用不切片。

情况 (2) 按值传递(指针的)无切片。

情况(3)按值传递:anA是从anB复制构造的,只取顶部A sliceanA 没有 B 部分。

此处出现与案例 (3) 相同的切片:

B b;
A a = b;

我们创建一个 B 并从中复制构造一个 A