在 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。
我的问题是:
总是这样吗?
假设我为 class B 创建了一个复制构造函数,然后当我按值将 B 类型的 object 传递给方法时,编译器会使用它吗?或者它是否仍然将 B 复制为 A(object 切片)?如果不是,为什么?
谢谢!
编辑:示例
// 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
slice。 anA
没有 B
部分。
此处出现与案例 (3) 相同的切片:
B b;
A a = b;
我们创建一个 B
并从中复制构造一个 A
。
我正在学习 C++,在我老师的课程中,他解释说多态与按值传递不兼容。
他解释说,当你将一个 object 按值传递给一个方法时,编译器会在堆栈中生成一个 object 的副本,出于优化原因,他选择创建一个副本parent class 的类型。
例如,假设我有一个名为 A 的 class,而 class B 是 A 的 child class。 如果我按值传递类型 B 的 object,编译器会在堆栈上创建它的副本,但类型为 A。
我的问题是:
总是这样吗?
假设我为 class B 创建了一个复制构造函数,然后当我按值将 B 类型的 object 传递给方法时,编译器会使用它吗?或者它是否仍然将 B 复制为 A(object 切片)?如果不是,为什么?
谢谢!
编辑:示例
// 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
slice。 anA
没有 B
部分。
此处出现与案例 (3) 相同的切片:
B b;
A a = b;
我们创建一个 B
并从中复制构造一个 A
。