2015-07-25 1 views
1

Все,С ++ производного класса цепь Конструктор Ошибка

У меня есть 3 класса (в C++) в качестве наследования цепи с базовыми по умолчанию конструкторов, установленных для каждого из них. Однако 3-й класс в цепочке жалуется на отсутствие соответствующего конструктора для первого. Ниже приведен код для конструкторов:

class Base 
{ 
    protected: 
     int a, b; 
    public: 
     Base::Base(int first, int second) 
     { 
      this->a = first; 
      this->b = second; 
     } 
} 

class Second : protected Base 
{ 
    protected: 
     int c; 
    public: 
     Second::Second(int first, int second, int third = 2) : Base(first, second) 
     { 
      this->c = third; 
     } 
} 

class Final : protected Second 
{ 
    private: 
     int d; 
    public: 
     Final::Final(int first, int second, int third = 2) : Second(first, second, third) 
     { 
     } 
} 

Во время компиляции я получаю ошибку

«В конструкторе Final :: Final (ИНТ первый, не ИНТ второй, внутр третий)

нет соответствующего вызова to Base() "

Почему это пытается вызвать Base() вместо Base (first, second)?

+3

Он компилируется и работает на моем ПК. Единственное, что я вижу, - это точки с запятой после: class A {}; <- –

+0

Base :: Base ... Final :: Final ... вам, похоже, нравится печатать. Внутри определения класса вы можете опустить квалификацию, используя только Base .. Final. –

+0

Какой компилятор вы используете? Ваш код компилируется в Visual Studio 2013 после добавления ';', предложенного @JakaKonda –

ответ

0

Это может помочь вам, так я бы структурировал эту иерархию классов.

class Base { 
protected: 
    int m_a, m_b; 

public: 
    Base(int first, int second); 
    virtual ~Base(){} 
}; 

Base::Base(int first, int second) : 
m_a(first), 
m_b(second) 
{} 

class Second : protected Base { 
protected: 
    int m_c; 
public: 
    Second(int first, int second, int third = 2); 
    virtual ~Second(){} 
}; 

Second::Second(int first, int second, int third) : 
Base(first, second), 
m_c(third) 
{} 

class Final : protected Second { 
private: 
    int m_d; 
public: 
    Final(int first, int second, int third = 2); 
    virtual ~Final(){} 
}; 

Final::Final(int first, int second, int third) : 
Second(first, second, third) 
{} 

Если вы хотите сохранить ваши определения в классе, а не определять их за пределами объявления класса попробуйте этот

class Base { 
protected: 
    int m_a, m_b; 

public: 
    Base(int first, int second) : m_a(first), m_b(second) {} 
    virtual ~Base(){} 
}; 

class Second : protected Base { 
protected: 
    int m_c; 
public: 
    Second(int first, int second, int third = 2) : 
    Base(first, second), 
    m_c(third) {} 

    virtual ~Second(){} 
}; 

class Final : protected Second { 
private: 
    int m_d; 
public: 
    Final(int first, int second, int third = 2) : 
    Second(first, second, third) {} 

    virtual ~Final(){} 
}; 

Это хорошая практика, чтобы убедиться, что ваши деструкторов объявлены как виртуальные, когда используя наследование. Вам нужно всего лишь использовать оператор разрешения области класса, если вы определяете конструктор или функции вне класса, и для установки основных переменных-членов вам не нужно использовать оператор this-> указателя, вы можете использовать список инициализаторов как я показали при определении ваших конструкторов.

0

Во-первых, вам не хватает ; в конце определения класса. Кроме того, при реализации функций-членов внутри класса a класс, вы не можете использовать оператор оценки ::, это недействительно в C++. Вы можете найти This полезным.