2016-10-31 3 views
-1

У меня есть проблема с производным классом от абстрактного класса Примера:производный класс конструктор из абстрактного класса

#include <iostream> 

using namespace std; 

class A 
{ 
protected: 
    int a,b; 
public: 
    A(): a(0), b(0) {} 
    A(int na,int nb): a(na), b(nb) {} 
    virtual void print() = 0; // Reason to be an abstract class 
}; 

class B : public A 
{ 
public: 
    B(int a, int b) {A(a,b);} 
    void print() 
    { 
    cout << a << endl; 
    cout << b << endl; 
    } 
}; 

int main(){ 

    B clase(3,2); 
    clase.print(); 
    return 0; 
} 

Приведенных выше код дать мне ошибку, как это:

lab1.cpp: In constructor ‘B::B(int, int)’: 
lab1.cpp:20:10: error: invalid cast to abstract class type ‘A’ 
    A(a,b); 
     ^
lab1.cpp:5:7: note: because the following virtual functions are pure within ‘A’: 
class A 
    ^
lab1.cpp:12:16: note: virtual void A::print() 
    virtual void print() = 0; 
       ^

Примечания : Я знаю, как это сделать, конструктор B будет выглядеть так:

B(int a, int b): A(a,b) {} 

Но мой реальный вопрос: что, если я хочу вызвать конструктор моего производного класса внутри ветвей (например, вышеприведенный код)? Каков правильный способ вызова абстрактного конструктора внутри ветвей?

+0

Значит, вы хотите позвонить подрядчику без фактического конструирования объекта? Как так ? ... и что более важно, почему? – HazemGomaa

+0

'A (a, b)' означает построить 'A', который является абстрактным, поэтому он терпит неудачу. – songyuanyao

+0

"Что делать, если я хочу вызвать конструктор моего производного класса внутри ветвей? Вы имели в виду вызов конструктора' B' в конструкторе 'B'? – songyuanyao

ответ

1

Каков правильный способ вызова абстрактного конструктора внутри ветвей?

Существует нет.

Для этого есть веская причина. Суперкласс должен быть построен до того, как ваш класс будет построен.

Когда вы пишете код для конструктора, у вас есть разумно сконструированный объект. Ваш родитель построен, по крайней мере.

Это аккуратно выражается синтаксисом инициализации конструктора.

B::B(int a, int b):A(a, b) { 
    // A is complete. now we can do stuff. 
0

вы должны инициализировать часть А б в списке член-инициализатора не внутри тела конструктора B:

class A 
{ 
    virtual void print() = 0 {cout << "I am Pure function";} 
}; 

class B : public A 
{ 
    public: 
     B(int a, int b) : A(a,b) {} 
     // B(int a, int b) {A(a,b);} /. incorrect 
     void print() 
     { 
     cout << a << endl; 
     cout << b << endl; 
     } 
}; 
  • вы можете также определить чистую виртуальную функцию, которая позволяет объекты производный класс для обеспечения функциональности.
Смежные вопросы