我想了解以下代码。构造函数在赋值期间未被调用
我创建了两个类BClass和DClass,如下所示。
//我的头文件
class BClass
{
public:
BClass();
~BClass();
virtual void PrintMe() const;
};
class DClass : public BClass
{
public:
DClass();
~DClass();
void PrintMe() const;
};
//我的cpp文件
BClass::BClass()
{
}
BClass::~BClass()
{
}
void BClass::PrintMe() const
{
printf("This is base class \n");
}
DClass::DClass()
{
}
DClass::~DClass()
{
}
void DClass::PrintMe() const
{
printf("This is derived class \n");
}
//我的主文件
BClass b; //BClass constructor called
b.PrintMe();
DClass d; //DClass constructor called
d.PrintMe();
BClass* b1 = &d; //No constructor called as it is pointer assignment
b1->PrintMe();
BClass b2 = d; //No constructor called...expecting BClass constructor to be called???
b2.PrintMe();
在最后一节,我期待的是BClass构造函数被调用。但事实并非如此。有人能解释我发生了什么事吗?
如果做到这样,我们知道BClass构造函数被调用
BClass b2; //BClass constructor called
b2 = d;
可能有人解释
BClass b2;
b2 = d;
谢谢
BClass b2 = d;
和
之间的差异。
谢谢你的解释。 – jaklucky
即使使用DClass对象初始化,为什么b2.PrintMe()会调用BClass :: PrintMe()? – jaklucky
@jaklucky,因为'b2'的类型是'BClass'(和[slicing](http://stackoverflow.com/q/274626/3959454)在赋值期间发生)。如果你想要虚拟行为,你可以编写'BClass&b2 = d'来创建一个引用,或者像你在代码中那样创建一个指针。 –