Пожалуйста, прочитайте код, чтобы понять ситуацию.
#include <iostream>
using namespace std;
class one
{
protected:
int x;
public:
one(int a)
{
x=a;
cout << "one cons called\n";
}
void display(void)
{
cout << "x = " << x << endl;
}
~one()
{
cout << "one destroy\n";
}
};
class two : virtual protected one
{
protected:
int y;
public:
two(int a,int b) : one(a),y(b)
{
cout << "two cons called\n";
}
void display(void)
{
one::display();
cout << "y = " << y << endl;
}
~two()
{
cout << "two destroy\n";
}
};
class three : protected virtual one
{
protected:
int z;
public:
three(int a,int b) : one(a),z(b)
{
cout << "Three cons called\n";
}
void display(void)
{
one::display();
cout << "z = " << z << endl;
}
~three()
{
cout << "three destroy\n";
}
};
class four : private two, private three
{
public:
four(int a,int b,int c) :one(a), two(a,b),three(a,c)
{
cout << " four cons called\n";
}
void display(void)
{
one::display();
cout << "y = " << y << endl;
cout << "z = " << z << endl;
}
~four()
{
cout << "four destroy\n";
}
};
int main()
{
four ob(1,2,3);
ob.display();
return 0;
}
Если я заменю код
four(int a,int b,int c) :one(a), two(a,b),three(a,c)
с
four(int a,int b,int c) :two(a,b),three(a,c)
сообщение об ошибке, например: нет соответствующей функции для вызова 'one :: one ()' в моем кодовом блоке ide.
Как вы можете видеть, это код, основанный на проблеме алмаза. Первый класс — это класс grand_parent. Второй и третий классы служат родительским классом, а четвертый класс — дочерним. Поэтому я использовал ключевое слово virtual, чтобы избежать двусмысленности. Все, что я здесь понимаю, кроме одной вещи. Я знаю, что когда родительский класс имеет параметризованный конструктор, нам нужно предоставить аргументы этому конструктору из производного класса. Итак, зачем же нужно предоставлять аргумент конструктору one, где четвертый класс имеет только 2 родительских класса, то есть two и three . Код выдаст мне ошибку времени компиляции, если я не вызову конструктор один из класса четыре. Пожалуйста, объясните мне, почему мы должны это сделать.
display
во всех классах? А почему у васprivate
наследство? Частное наследование обычно рекомендуется против композиции. - person Some programmer dude   schedule 26.07.2019