在继承的C ++中通过值传递对象

问题描述 投票:1回答:1

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

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

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

我的问题是:

  • 总是这样吗?

  • 假设我为类B创建了一个Copy构造函数,当我将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方法指定为虚拟方法。

我正在学习C ++,在我的老师的课程中,他解释说多态性与按值传递不兼容。他解释说,当您按值将对象传递给方法时,编译器...

c++ object inheritance compiler-optimization pass-by-value
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.