2014-09-01 4 views
0

Я написал простую программу, которая занимается повторным наследованием. Я использую базовый класс, два класса ребенка и класс внучатМножественное наследование и унаследованный элемент данных в списке инициализации конструктора производного класса

class Parent{ 
public: 
Parent(string Word = "", double A = 1.00, double B = 1.00): sWord(Word), dA(A), dB(B){ 
} 


//Member function 
void Operation(){ 
cout << dA << " + " << dB << " = " << (dA + dB) << endl; 
} 

protected: 
string sWord; 
double dA; 
double dB; 
}; 

Теперь вот первый класс ребенок

class Child1 : public Parent{ 
public: 
//Constructor with initialisation list and inherited data values from Parent class 
Child1(string Word, double A, double B , string Text = "" , double C = 0.00, double D = 0.00): Parent(Word, A, B), sText(Text), dC(C), dD(D){}; 


//member function 
void Operation(){ 
cout << dA << " x " << dB << " x " << dC << " x " << dD << " = " << (dA*dB*dC*dD) << endl;} 

void Average(){ 
cout << "Average: " << ((dA+dB+dC+dD)/4) << endl;} 


protected: 
string sText; 
double dC; 
double dD; 
}; 

Вот второй дочерний класс

class Child2 : public Parent { 
public: 
//Constructor with explicit inherited initialisation list and inherited data values from Base Class 
Child2(string Word, double A, double B, string Name = "", double E = 0.00, double F = 0.00): Parent(Word, A, B), sName(Name), dE(E), dF(F){} 


//member functions 
void Operation(){ 
cout << "(" << dA << " x " << dB << ") - (" << dE << "/" << dF << ")" << " = " 
    << (dA*dB)-(dE/dF) << endl;} 

void Average(){ 
cout << "Average: " << ((dA+dB+dE+dF)/4) << endl;} 

protected: 
string sName; 
double dE; 
double dF; 
}; 

Вот класс внука, который имеет дело с множественным наследованием

В основной функции я затем создать объект внучат и инициализирует его так:

GrandChild gObj("N\A", 24, 7, "N\A", 19, 6); 

//calling the void data member function in the GrandChild class 
gObj.Operation(); 

Ответ я получаю на это

SUM: 0 

Однако ответ должен быть 56! Очевидно, что используются унаследованные значения по умолчанию, используемые в конструкторе для класса GrandChild, а не значения данных, которые включены в конструкцию объекта GrandChild. Как я могу решить эту проблему?

+1

Расскажите об этом своему профессору, поскольку у вас нет никаких вопросов. – P0W

+0

Извините, вопрос был лучше написан сейчас. Спасибо – Josh

+1

Это не значения по умолчанию в конструкторе большого дочернего объекта, которые используются, но те, которые содержатся в конструкторах дочерних объектов. Фактически вы дали значения A и B, но не для CD и E, проверьте свои порядков параметров и значений по умолчанию в дочерних классах – Drax

ответ

1

Для того, чтобы получить код, чтобы работать, как я хочу, я сделал эти изменения

//Constructor with explicitly inherited data members 
GrandChild(string Word, double A, double B, string Text, double C, double D, 
     string Name, double E, double F): 
      Child1(Word, A, B, Text, C, D), 
       Child2(Word, A, B, Name, E, F){ } 

В основном каждый класс ребенок наследует свой собственный отдельный класс Parent. Элемент данных этого родительского класса отображается в обоих списках конструкторов дочерних классов. При построении класса GrandChild я объявляю эти значения в качестве параметров в своем конструкторе (только один раз, чтобы избежать дублирования)! Я также включаю унаследованные дочерние классы.

В основном я тогда можно создать объект внучат так:

GrandChild gObj("n\a", 0.00, 0.00, "text", 3, 3, "text", 3, 3, 7); 

А с помощью оператора точки и функцию члена аннулируется я получаю правильный ответ:

gObj.Operation() 

, который:

sum: 12 
Смежные вопросы