C ++ 11 — В иерархии, как конструктор сына может установить членов конструктора деда в переполнении стека

В иерархии, как конструктор сына может устанавливать члены конструктора дедушки в c ++.

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

-2

Решение

Это не может, по крайней мере, не с синтаксисом инициализатора. Данные классы, подобные этим

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) { }
1

Другие решения

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

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

0

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

подобно

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

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

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


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

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

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

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

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

0

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

}

Вот
Управляющий это сын
Менеджер отец
а человек и работник дедушка

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

-1