2016-04-09 7 views
-2

階層では、息子のコンストラクタが祖父のコンストラクタのメンバーをC++でどのように設定できるかを示します。階層では、息子のコンストラクタがC++で祖父のコンストラクタのメンバーを設定する方法

祖父>父>息子

+0

ようson C++の用語の基礎となったクラス(のようfathergrandfatherにコンストラクタを追加する方が良いだろう。これが可能です父)と派生クラス(息子)。 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は息子 マネージャでは、父 で、人とEmployeはあなたが基本的な考え方を持っているし、あなたがより行うどのように依存したデータを印刷に関することができ、このの助けを借りて、祖父

です。メンバー関数を使用して印刷することができます。

+0

これは答えではありません。 –

0

できません。それはその仕事ではありません。各「レベル」は、その上の「レベル」のみを初期化することができます。それはそうであるべきである。

ただし、仮想継承を使用するとこの規則はなくなり、各 "レベル"は他のすべての "レベル"のコンストラクタ引数の提供に直接責任があります。

+0

Re«各 "レベル"は、その上の "レベル"のみを初期化することができます»、それは仮想継承のために保持されません。私。一般的な声明としては間違っています。 –

+0

それは可能です以下のコードを参照してくださいそれを試してください –

+0

@ Cheersandhth. - Alf:ええと、第2段落を読んで?私は文字通りそのすべてを言った。 –

0

メンバーの初期化子リストを使用して、直接ベースクラスのコンストラクタに引数を渡します。

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

順番にようにその基底クラスのコンストラクタに引数を渡す、となります基底クラスのコンストラクタのように。

仮想継承の場合にのみ派生した派生派生の&hellipです。クラスは "grandfather"クラスを直接初期化できます。それは高度な話題です。あなたが今尋ねていることであるとは思えません。その問題に遭遇した場合は、新しい質問をすることをお勧めします。


用語について:

  • C++用語は基底クラス(父)と派生クラス(息子)です。

  • Smalltalkの用語は、スーパー(父)とサブクラス(息子)です。

用語息子は、一般的に(それは私がそれらを参照してください最初の時間です!)は使用されませんが、時には1は、階層–の中で配置を示すためにを使用していますノード、クラス、何でも。この質問に使用されていないが

関連は、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; 
} 

しかし、この

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

してから、この

son::son() : father(0, 1), z(2) { } 
関連する問題