a1
и b1
являются полностью отдельными экземплярами объектов в памяти.У них есть собственные копии членов a
и b
в памяти.Они не имеют ничего общего друг с другом.Что бы вы ни делали для a1
, это никак не повлияет на b1
, и наоборот.
Вы инициализируете только элементы a1
, вы вообще не инициализируете элементы b1
.Вот почему вы видите мусор, когда пытаетесь распечатать элементы b1
.
Перед вызовом b1.showdata()
, вам необходимо вызвать b1.setdata()
для инициализации b1
членов, например:
int main() {
A a1;
B b1;
a1.setdata(5, 4);
a1.showdata();
b1.setdata(1, 2); // <-- add this!
b1.showdata();
}
Вы также должны предоставить class A
конструктор по умолчанию, который инициализирует элементы значениями по умолчанию, в случае, если setdata()
не вызывается после построения (например, что произошло в вашем случае), например:
class A {
int a, b;
public:
A() : a(0), b(0) {} // <-- add this!
void setdata(int x, int y) { a = x; b = y; }
void showdata() { std::cout << a << b; }
};
В качестве альтернативы, вы можете рассмотреть возможность предоставления class A
и class B
конструктора, который принимает значения в качестве входных данных, например:
class A {
int a, b;
public:
A() : a(0), b(0) {}
A(int x, int y) : a(x), b(y) {} // <-- add this!
void setdata(int x, int y) { a = x; b = y; }
void showdata() { std::cout << a << b; }
};
class B : public A {
public:
B() : A() {}
B(int x, int y) : A(x, y) {}
};
/* or simpler:
class B : public A {
public:
using A::A; // <-- inherit all constructors
};
*/
int main() {
A a1(5, 4);
B b1(1, 2);
a1.showdata();
b1.showdata();
}