2016-04-09 6 views

Antwort

-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() ; 

} 

hier It_Manager ist Sohn Manager ist Vater und Person und Employe sind Großvater

mit Hilfe dieser Sie Grundkonzept haben kann und über dem Drucken von Daten, die von Ihnen abhängen, wie Sie tun, als. Man kann die Mitgliedsfunktion verwenden, um sie zu drucken.

+0

Dies ist keine Antwort. –

0

Es kann nicht. Das ist nicht seine Aufgabe. Jede "Ebene" kann nur die darüber liegende "Ebene" initialisieren. So sollte es sein.

Diese Regel verschwindet jedoch, wenn Sie virtuelle Vererbung verwenden, und jede "Ebene" wird direkt verantwortlich für die Bereitstellung von Konstruktorargumenten für jede andere "Ebene".

+0

Re "Jede" Ebene "kann nur die" Ebene "darüber initialisieren.», Das gilt nicht für die virtuelle Vererbung. I.e. es ist falsch als allgemeine Aussage. –

+0

ist es möglich, sehen Sie den Code unten und versuchen Sie es –

+0

@ Cheersandthth.-Alf: Ähm, lesen Sie den zweiten Absatz? Ich habe das alles buchstäblich gesagt. –

0

Sie verwenden Memberinitialisierungslisten, um Argumente an einen direkten Basisklassenkonstruktor zu übergeben.

Wie

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

Die Konstruktor Basisklasse wiederum Argumente sein Basisklasse Konstruktor übergeben, und so weiter.

Es ist nur im Fall von virtuellen Vererbung, dass eine abgeleitete-von abgeleiteten abgeleitet- & hellip; Klasse kann eine "Großvater" -Klasse direkt initialisieren. Und das ist ein hochentwickeltes Thema, das wahrscheinlich nicht das ist, worüber du jetzt fragst. Ich schlage vor, Sie stellen eine neue Frage darüber, wenn Sie auf dieses Problem stoßen.


Bezüglich Terminologie:

  • Die C++ Terminologie ist Basisklasse (Vater) und abgeleiteten Klasse (Sohn).

  • Die Smalltalk Terminologie ist Super (Vater) und Unterklasse (Sohn).

Die Begriffe Vater und Sohn werden verwendet, im Allgemeinen nicht (es ist das erste Mal, dass ich sie sehen!), Aber manchmal verwendet man Eltern und Kind Platzierungen in einer Hierarchie zu bezeichnen – von Knoten, Klassen, was auch immer.

Ähnliche, wenn auch nicht in dieser Frage verwendet, eine rein virtuellen Funktion in C++ entspricht eine Methode, die Unterklasse Verantwortung in Smalltalk ist.

0

Es kann nicht, zumindest nicht mit der Initialisersyntax.Gegeben Klassen wie diese

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

    son(); 
}; 

Schreiben

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

ist ungültig. Nur der direkte Basisklassenkonstruktor ist verfügbar, Basismitglieder nicht. Dies ist möglich:

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

Aber es wäre besser, Konstrukteuren wie diese

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

und dann son wie diese

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