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