2016-04-09 5 views
-2

В иерархии, как конструктор сына может устанавливать элементы конструктора деда в C++.В иерархии, как конструктор сыновей может устанавливать элементы конструктора деда в C++

дед> отец> сын

+0

C++ терминология основана класс (отец) и производный класс (сын). Smalltalk terminlogy - суперкласс (отец) и подкласс (сын). –

ответ

-1
#include<iostream> 
#include<string> 
using namespace std; 
class Person{ 
int age; 
protected : 
    string name; 
    public: 
    Person(int a,string s) 
    { 
    age=a; 
    name=s; 
    } 
    Display_0() 
    { 
    cout<<"\nName   : "<<name; 
    cout<<"\nAge   : "<<age; 
    } 

}; 

class Employe { 
int employeid; 
protected : 
    double salary; 
    public: 
    Employe(int id,double sal) 
    { 
    employeid=id; 
    salary=sal; 

    } 

    Display_1() 
    { 


    cout<<"Id is   : "<<employeid; 
    cout<<"\nSalary is  : "<<salary; 
    } 
}; 

class Manager : public Person, public Employe 
{ 
string type; 

public: 
    Manager(string t,int id,double sal,int age,string name) : Employe(id, sal) , Person(age, name) 
    { 
    type=t; 
    } 
string get_type() 
    { 
    return type; 
    } 

    Display_2() 
    { 
    Display_0(); 
    cout << "\n"; 
    Display_1(); 
    cout<<"\nType is  : "<<type; 
    } 
}; 

class It_Manager : public Manager{ 
private : 
    int noOfPersons; 
    public: 
    It_Manager(int n,string na,int id,double sal,int age,string name) : Manager(na, id, sal, age, name) 
    { 
    noOfPersons=n; 
    } 

    Display_last() 
    { 
    Display_2(); 
    cout<<"\nNo of Persons : "<<noOfPersons; 
    } 

}; 
main() 
{ 
    It_Manager b(1,"Computer Scientist",152118,150000,100,"Muhammad Owais") ; 
    b.Display_last() ; 

} 

здесь It_Manager сын менеджер отец и лицо и служащий являются дедушкой

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

+0

Это не ответ. –

0

Это не может. Это не его работа. Каждый «уровень» может инициализировать только «уровень» над ним. Так и должно быть.

Однако это правило уходит, когда вы используете виртуальное наследование, и каждый «уровень» становится непосредственно ответственным за предоставление аргументов конструктора для каждого другого «уровня».

+0

Re «Каждый« уровень »может инициализировать только« уровень »над ним.», Это не выполняется для виртуального наследования. То есть это неверно как общее утверждение. –

+0

можно посмотреть код ниже и попробовать –

+0

@ Cheersandhth.-Alf: Ум, прочитайте второй абзац? Я буквально все это сказал. –

0

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

Как

class Derived 
    : public Base 
{ 
public: 
    Derived() 
     : Base("joo hoo")   // ← A member initializer list 
    {} 
}; 

конструктор базового класса, в свою очередь передать аргументы его базового класса конструктора, и так далее.

Это только в случае виртуальное наследование, что производная от производного & hellip; класс может непосредственно инициализировать класс «дедушка». И это передовая тема, вряд ли будет тем, о чем вы просите сейчас. Я предлагаю вам задать новый вопрос, если вы столкнулись с этой проблемой.


Что касается терминологии:

  • C++ терминология базовый класс (отец) и производный класс (сын).

  • Smalltalk терминология суперкласс (отец) и подкласс (сын).

Термины отец и сын, как правило, не используется (это первый раз, когда я вижу их!), Но иногда один использует родителя и ребенка для обозначения мест размещения в иерархии – из узлы, классы, что угодно.

Похожие, хотя и не используются в этом вопросе, чисто виртуальная функция в C++ соответствует методу, который подкласса ответственность в Smalltalk.

0

Он не может, по крайней мере, не содержать синтаксис инициализатора.Указанные классы, как эти

class grandfather { 
    int x; 
}; 
class father : public grandfather { 
    int y; 
}; 
class son : public father { 
    int z; 

    son(); 
}; 

написание

son::son() : x(0), y(1), z(2) { } 

не является действительным. Доступен только конструктор прямого базового класса, базовые элементы - нет. Это возможно:

son::son() : father(), z(2) { 
    x = 0; 
    y = 1; 
} 

Но было бы лучше, чтобы добавить конструкторы father и grandfather как этого

grandfather::grandfather(int xx) : 
    x(xx) { } 
father::father(int xx, int yy) : 
    grandfather(xx), y(yy) { } 

, а затем son как этого

son::son() : father(0, 1), z(2) { }