2015-07-09 4 views
1

Путаница в конструкторе вызова через временный объект в качестве аргумента в функциипутаница в конструкторе вызова в виртуальной функции

#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

Это не временный объект. Аргумент передается по значению функции, поэтому будет вызываться копия ctor, а не по умолчанию ctor. Обратите внимание, что компилятор предоставит конструктор копирования, если пользователь не определен, вы можете определить его самостоятельно для вывода некоторой информации об отладке.

Base(const Base& a) : i (a.i) 
{ 
    cout<<"Base copy constructor \n"; 
} 
+1

Компилятор предоставит конструктор по умолчанию, если пользователь не определен. – Subhajit

+0

Да, копия по умолчанию ctor i означает – Subhajit

+0

@Subhajit Да, я добавил ее, чтобы ответить. – songyuanyao

1

он будет вызывать copy construct функцию, чтобы создать временный объект класса Base в функции

3

Мой вопрос заключается в том, что, почему нет вызова по умолчанию конструктору базового класса, когда мы создаем Временный объект класса Base в функции

экземпляр Base строится с помощью конструктора копирования, когда вызов somefunc сделан. Этот объект не создается с использованием конструктора по умолчанию. Конструктор копии по умолчанию создается компилятором, так как вы его не определили.

Смежные вопросы