在层次结构中,子构造函数如何在 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 (儿子).

父亲儿子一般不用(第一次见!),但有时会用parentchild 表示节点层次结构中的位置,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;
}

但是像这样给fathergrandfather添加构造函数会更好

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

然后son像这样

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