gpt4 book ai didi

c++ - 在 C++ 的继承上下文中按值传递对象

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:15 25 4
gpt4 key购买 nike

<分区>

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

他解释说,当你按值将对象传递给方法时,编译器会在堆栈中生成对象的拷贝,出于优化原因,他选择创建父类类型的拷贝。

例如,假设我有一个名为 A 的类,而 B 类是 A 的子类。如果我按值传递类型 B 的对象,编译器会在堆栈上创建它的拷贝,但类型为 A。

我的问题是:

  • 总是这样吗?

  • 假设我为 B 类创建了一个 Copy Constructer,当我将 B 类型的对象按值传递给方法时,编译器会使用它吗?或者它是否仍然将 B 复制为 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() 被调用”),而案例 3 则不会(它将输出:“A::Display () 被调用"),即使在 A 类中将 Display 方法指定为虚拟方法。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com