Я пытаюсь понять следующий код.Конструктор, не вызываемый во время назначения
Я создал два класса 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 = d;
и
BClass b2;
b2 = d;
Спасибо.
Благодарим вас за разъяснение. – jaklucky
Почему b2.PrintMe() вызывает BClass :: PrintMe(), даже если он инициализирован объектом DClass? – jaklucky
@jaklucky, потому что тип 'b2'' 'BClass' (и [нарезка] (http://stackoverflow.com/q/274626/3959454) произошел во время назначения). Если вы хотите виртуальное поведение, вы можете написать 'BClass & b2 = d', который создает ссылку, или создать указатель, как в вашем коде. –