1

For instance, consider:

class Deriv : public Base {...};
...
bar(Deriv d);
bar(Base b);
foo(Base b) {bar(b);}
...
Deriv x;
foo(x); // does x get treated as Base for the bar() call
        // or retain its Deriv type?

And also what if foo passes by reference?

4

2 回答 2

6

您正在按值传递,因此您正在创建一个 Base 类型的新对象并对其进行复制分配..

非常糟糕,你会体验到切片......它不会保留它的阶段而不是建议。 http://en.wikipedia.org/wiki/Object_slicing

要么通过引用传递,要么通过 const 引用,这无论如何都更好更快:

bar(const Base& b)

或将指针传递给对象,您将保留状态。酒吧(基地* b);

这将是处理这个问题的正确方法。

于 2013-05-16T23:15:05.053 回答
3

在您的示例中,x将是 a ,这是因为您在调用该函数时Base正在创建一个新对象。Base也就是说,在函数调用中,构造函数被调用,从参数的 ( 's)子对象Base创建一个Base b副本(称为对象切片)。它没有被视为a ,它创建了一个新的xBaseBaseBase

但是,如果您将参数作为 a Base &,它将被视为 a Derived,请考虑以下代码:

#include <iostream>
class Base {
    public:
        virtual void func() const {
            std::cout << "Base::Func()" << std::endl;
        }

};

class Derived : public Base {
    public:
        virtual void func() const {
            std::cout << "Derived::Func()" << std::endl;
        }
};

int do_func_value(Base b){
    b.func(); // will call Base::func
}

int do_func_ref(const Base & b){
    b.func(); // will call whatever b's actual type is ::func
}

int main(void){
    Derived d;
    do_func_value(d);
    do_func_ref(d);
    return 0;
}

这输出:

Base::Func()
Derived::Func()
于 2013-05-16T23:14:40.280 回答