在层次结构中,子构造函数如何在 C++ 中设置祖父构造函数的成员
In a hierarchy, how son constructor can set members of grandfather constructor in c++
在层次结构中,子构造函数如何在 c++ 中设置祖父构造函数的成员。
祖父>父亲>儿子
不能。那不是它的工作。每个 "level" 只能初始化其上方的 "level"。本来就是这样。
但是,当您使用虚拟继承时,这条规则就消失了,每个 "level" 直接负责为每个其他 "level".
提供构造函数参数
您使用成员初始值设定项列表将参数传递给直接基 class 构造函数。
喜欢
class Derived
: public Base
{
public:
Derived()
: Base( "joo hoo" ) // ← A member initializer list
{}
};
base class 构造函数将依次将参数传递给 its base class' 构造函数,依此类推。
只有在虚继承的情况下一个derived-of derived-of derived-... class可以直接初始化一个"grandfather" class。这是一个高级话题,不太可能是您现在要问的问题。如果你遇到这个问题,我建议你提出一个新的问题。
关于术语:
C++术语是base class(父)和derived class (儿子).
Smalltalk 术语是 superclass(父亲)和 subclass (儿子).
父亲和儿子一般不用(第一次见!),但有时会用parent 和 child 表示节点层次结构中的位置,classes,等等。
相关,虽然没有在本题中使用,但C++中的一个纯虚函数对应的方法是subclassresponsibility 在 Smalltalk 中。
#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是儿子
经理是爸爸
Person 和 Employe 是祖父
借助于此,您可以了解基本概念和打印数据,这取决于您的操作方式。可以使用成员函数来打印它。
它不能,至少不能用初始化语法。鉴于 class 这些
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) { }
无效。只有直接基 class 构造函数可用,基成员不可用。这是可能的:
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) { }
在层次结构中,子构造函数如何在 c++ 中设置祖父构造函数的成员。
祖父>父亲>儿子
不能。那不是它的工作。每个 "level" 只能初始化其上方的 "level"。本来就是这样。
但是,当您使用虚拟继承时,这条规则就消失了,每个 "level" 直接负责为每个其他 "level".
提供构造函数参数您使用成员初始值设定项列表将参数传递给直接基 class 构造函数。
喜欢
class Derived
: public Base
{
public:
Derived()
: Base( "joo hoo" ) // ← A member initializer list
{}
};
base class 构造函数将依次将参数传递给 its base class' 构造函数,依此类推。
只有在虚继承的情况下一个derived-of derived-of derived-... class可以直接初始化一个"grandfather" class。这是一个高级话题,不太可能是您现在要问的问题。如果你遇到这个问题,我建议你提出一个新的问题。
关于术语:
C++术语是base class(父)和derived class (儿子).
Smalltalk 术语是 superclass(父亲)和 subclass (儿子).
父亲和儿子一般不用(第一次见!),但有时会用parent 和 child 表示节点层次结构中的位置,classes,等等。
相关,虽然没有在本题中使用,但C++中的一个纯虚函数对应的方法是subclassresponsibility 在 Smalltalk 中。
#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是儿子 经理是爸爸 Person 和 Employe 是祖父
借助于此,您可以了解基本概念和打印数据,这取决于您的操作方式。可以使用成员函数来打印它。
它不能,至少不能用初始化语法。鉴于 class 这些
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) { }
无效。只有直接基 class 构造函数可用,基成员不可用。这是可能的:
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) { }