Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Множественное наследование

Автор: Rocket 12.04.2008 23:44

Вот текст программы:


#include<iostream>
#include<conio.h>

using namespace std;

class Base1
{ int i;

public:
Base1()
{ i=0;
cout<<"Run Base1 Constructor!"<<endl;
}

Base1(int I)
{ i=I;
cout<<"Run base1 ExtraConstructor!"<<endl;
}

};

class Base2
{ char M[20];

public:
Base2()
{
M = 'empty';
cout<<"run Base2 Constructor!"<<endl;
}

Base2(char* m)
{ strcpy(M,m);
cout<<"Run Base2 extraConstructor!"<<endl;
}

};

class Derived:public Base1, public Base2
{ char ch;

friend ostream& operator << (ostream&, const Derived&);

public:
Derived()
{ ch="V";
cout<<"Run Derived Constructor!"<<endl;
}

Derived(char CH, char* m, int I)
{ ch=CH;
strcpy(M,m);
i=I;
cout<<"Run Derived ExtraConstructor!"<<endl;
}

};

ostream& operator << (ostream& os, const Derived& obj)
{
os <<
"ch = " << obj.ch <<endl <<"M = " << obj.M <<endl <<"i = " << obj.d <<endi;
return os;
}

int main()
{
Derived Der;
cout<<Der<<endl;
}


Как инициализировать поле M словом 'empty' в конструкторе Base2()? Как реализовать интерфейсные функции в классах Base1, Base2, Derived, которые позволяли бы изменить или прочесть значения i, M, ch соответствующих классов?

Автор: volvo 13.04.2008 0:26

Так?

#include<iostream>
#include<conio.h>

using namespace std;

class Base1 {
int i;

public:
int get_i() {
return i;
}
Base1() {
i=0;
cout<<"Run Base1 Constructor!"<<endl;
}

Base1(int I) {
i=I;
cout<<"Run base1 ExtraConstructor!"<<endl;
}
};

class Base2 {
char M[20];

protected:


public:
char *get_m() {
return M;
}

Base2() {
strcpy(M, "empty");
cout<<"run Base2 Constructor!"<<endl;
}

Base2(char* m) {
strcpy(M,m);
cout<<"Run Base2 extraConstructor!"<<endl;
}
};

class Derived:public Base1, public Base2 {
char ch;

friend ostream& operator << (ostream&, const Derived&);

public:
Derived() {
ch='V';
cout<<"Run Derived Constructor!"<<endl;
}

Derived(char CH, char* m, int I):Base1(I), Base2(m) {
ch=CH;
cout<<"Run Derived ExtraConstructor!"<<endl;
}
};

ostream& operator << (ostream& os, const Derived& obj)
{
os <<
"ch = " << obj.ch << endl <<
"M = " << ((Base2)obj).get_m() << endl <<
"i = " << ((Base1)obj).get_i() << endl;
return os;
}

int main() {
Derived Der;
cout<<Der<<endl;
}


Автор: Rocket 13.04.2008 1:13

Цитата(volvo @ 12.04.2008 21:26) *

Так?

#include<iostream>
#include<conio.h>

using namespace std;

class Base1 {
int i;

public:
int get_i() {
return i;
}
Base1() {
i=0;
cout<<"Run Base1 Constructor!"<<endl;
}

Base1(int I) {
i=I;
cout<<"Run base1 ExtraConstructor!"<<endl;
}
};

class Base2 {
char M[20];

protected:
public:
char *get_m() {
return M;
}

Base2() {
strcpy(M, "empty");
cout<<"run Base2 Constructor!"<<endl;
}

Base2(char* m) {
strcpy(M,m);
cout<<"Run Base2 extraConstructor!"<<endl;
}
};

class Derived:public Base1, public Base2 {
char ch;

friend ostream& operator << (ostream&, const Derived&);

public:
Derived() {
ch='V';
cout<<"Run Derived Constructor!"<<endl;
}

Derived(char CH, char* m, int I):Base1(I), Base2(m) {
ch=CH;
cout<<"Run Derived ExtraConstructor!"<<endl;
}
};

ostream& operator << (ostream& os, const Derived& obj)
{
os <<
"ch = " << obj.ch << endl <<
"M = " << ((Base2)obj).get_m() << endl <<
"i = " << ((Base1)obj).get_i() << endl;
return os;
}

int main() {
Derived Der;
cout<<Der<<endl;
}



О да, всё работает. Спасибо!