Путаница в вызове конструктора в виртуальной функции
Путаница в вызове конструктора через временный объект в качестве аргумента в функции
#include <iostream>
using namespace std;
class Base
{
protected:
int i;
public:
Base() {
cout<<"\n Default constructor of Base \n";
}
Base(int a)
{
i = a;
cout<<"Base constructor \n";
}
void display(){
cout << "\nI am Base class object, i = " << i ;
}
~Base(){
cout<<"\nDestructor of Base\n";
}
};
class Derived : public Base
{
int j;
public:
Derived(int a, int b) : Base(a) {
j = b;
cout<<"Derived constructor\n";
}
void display() {
cout << "\nI am Derived class object, i = "<< i << ", j = " << j;
}
~Derived(){
cout<<"\nDestructor Of Derived \n";
}
};
void somefunc (Base obj) //Why there is no call to default constructor of Base class
{
obj.display();
}
int main()
{
Base b(33);
Derived d(45, 54);
somefunc( b) ;
somefunc(d); // Object Slicing, the member j of d is sliced off
return 0;
}
Мой вопрос заключается в том, почему не вызывается конструктор по умолчанию базового класса, когда мы создаем временный объект базового класса в функции ( void somefunc(Base obj))
3 ответа
Мой вопрос заключается в том, почему нет вызова конструктора по умолчанию базового класса, когда мы создаем временный объект базового класса в функции
Экземпляр Base
создается с помощью конструктора копирования при вызове somefunc
сделан. Этот объект не создается с использованием конструктора по умолчанию. Конструктор копирования по умолчанию создается компилятором, поскольку вы его не определили.
Это не временный объект. Аргумент передается по значению функции, поэтому будет вызываться копия ctor, а не ctor по умолчанию. Обратите внимание, что компилятор предоставит конструктор копирования, если пользователь не определен, вы можете определить его самостоятельно, чтобы вывести некоторую отладочную информацию.
Base(const Base& a) : i (a.i)
{
cout<<"Base copy constructor \n";
}
Это позвонит copy construct
функция для создания Временного объекта Базового класса в функции