在您的示例中,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()