2013-07-23 7 views
2
#include<iostream> 
using namespace std; 
class base { 
public:  
    base() { 
     cout<<"Constructing base \n"; 
    } 
    virtual ~base() { 
     cout<<"Destructing base \n"; 
    } 
}; 
class derived: public base { 
public:  
    derived() { 
     cout<<"Constructing derived \n"; 
    }  
    ~derived() { 
     cout<<"Destructing derived \n"; 
    } 
}; 
int main(void) { 
    derived d();  
    return 0; 
} 

Почему в этой программе его вызывающий конструктор?C++ Конструктор не звонит

Может ли кто-нибудь объяснить?
.......

+1

, пожалуйста, правильно настройте свой код. – billz

+0

Вы должны вызвать base() ctor в производном(). производный(): base() {cout << "Построение производных"; } – bkausbk

+3

uhm ... Больше всего раздражает разбор. –

ответ

4

Попробуйте так:

int main(void) { 
    derived d;  
    return 0; 
} 

При вводе derived d() вы объявляете функцию, а не создавать объект.

+0

Или используйте 'производные d {};' (C++ 11) – sehe

5

Проблема заключается в том, что вы объявляете функцию здесь:

// function d(), returns a derived object. 
derived d(); 

Что вам нужно, это

derived d; // C++03, C++11 

или

derived d{}; // C++11 only 

Это "интересный" аспект C++ , где все, что может быть проанализировано как объявление функции, будет (при условии, что оно находится в контексте, где функция может быть объявлена).

Подробнее об изменении инициализации в GoTW #1 Variable initialization - or is it?.

+0

он получает предупреждение? для этого –

+0

Я видел предупреждения для этого в VS2012 –

+0

@GrijeshChauhan Я не получаю предупреждения на платформе, на которой я сейчас (древняя версия GCC), – juanchopanza

3

Декларация не подобает derived d();

Изменить это:

int main(void) 
{ 
    derived d;  // note the difference  
    return 0; 
}  

Что вы делаете ->derived d(), он объявляет функцию., что возвращает экземпляр производного класса.

Смотрите это для деталей: http://en.wikipedia.org/wiki/Most_vexing_parse

2

Это происходит потому, что derived d() рассматривается как «функции д, называется без каких-либо аргументов, возвращая экземпляр, полученный». «Самый неприятный анализ» Google.

2
int main(void) 
{ 
    derived d();  //here you are actually declaring a function 
    return 0; 
} 

Вы должны сделать это так:

derived d; 

Тогда он будет работать.

1

В C++ перед тем, как компилятор вызывает функцию, он должен знать о функции. Либо вам нужно написать функцию в потоке до ее вызова, либо, по крайней мере, объявить ее до вызова функции. Таким образом, вызывая derived d(), вы объявили функцию с именем d() с возвращаемым типом в качестве производного объекта, вы никогда не создали объект derived. это должно было быть,

int main() { 
    derived d; 
    return 0 

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