#include<iostream>
class A {
int a, b;
public:
void setdata(int x, int y) { a = x; b = y; }
void showdata() { std::cout << a << b; }
};
class B : public A { };
int main() {
A a1;
B b1;
a1.setdata(5, 4);
a1.showdata();
b1.showdata();
}
我只想使用类a
的{{1}}对象打印b
和b1
成员的值,因为它可以访问类{的成员函数{1}}因为类B
具有类A
的公共继承。但是,当我尝试使用B
打印A
和a
的值时,我会收到垃圾值。
有人可以解释为什么会发生这种情况以及如何解决这个问题吗?
答案 0 :(得分:3)
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();
}