2014-10-29 4 views
1

Мне нравится сохранять описания и определения классов отдельно на C++. Так, в заголовке я могу определить класс «базовый» следующим образом:Передача параметров конструкторам базового класса C++

# Base.h 
class Base 
{ 
    int n;  
public: 
    Base(int x); 
}; 

и определить его реализацию конструктора в файле CPP, т.е.

# Base.c 
Base::Base(int x) 
{ 
    n = x; 
} 

Теперь, если я определяю «получен 'класс, который наследует „базовый класс“, я могу передать параметры базового класса следующим образом:

#Derived.h 
class Derived : public Base 
{ 
    int t; 
public: 
    Derived(int y) : Base(t) {t = y;} 
} 

Но делать это таким образом требует, чтобы я помещаю тело конструктора для производного класса в заголовочном файле , то есть {t = y;}, и, следовательно, определение конструктора больше не отделено от его объявления. Есть ли способ передать аргументы в конструктор базового класса класса, который все еще позволяет мне определить конструктор для производного класса в файле cpp?

ответ

3

Да есть, в заголовочном файле:

class Derived : public Base 
{ 
    int t; 
public: 
    Derived(int y); // Declaration of constructor 
}; 

в то время как в файле CPP:

Derived::Derived(int y) : Base(t) { // Definition of constructor 
    t = y; 
} 

Member initializer lists допускаются в определении конструктора класса, а также в инлайн в классах. В случае, если вам интересно, я также рекомендую взглянуть на cppreference на два небольших оговорки относительно порядка инициализации и того факта, что члены будут инициализированы до того, как будет выполнен составной конструктор.

3

Есть ли способ передать аргументы конструктору базового класса класса, который по-прежнему позволяет определить конструктор для производного класса в файле cpp?

Конечно, есть. Заголовок может просто объявить конструктор, точно так, как вы сделали для Base:

class Derived : public Base 
{ 
    int t; 
public: 
    Derived(int y); 
}; 

, то вы можете реализовать, что в исходном файле, точно так, как вы сделали для Base:

Derived::Derived(int y) : Base(y), t(y) {} 

Обратите внимание, что вы» ll должен передать аргумент y, а не член (еще не инициализированный) t базовому конструктору. Базовые подэлементы всегда инициализируются перед членами.

+0

Конечно, просто ;-) –

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