派生类的对象赋值给基类对象

派生类对象隐含转换为基类对象,即用派生类对象中从基类继承来的成员,逐个赋值给基类对象的成员。
注意:public继承方式下,基类的private成员,在派生类中虽然无法访问,但是还是客观存在的!!!。如果一定要通过派生类对象访问基类的private成员,那么只能在基类中设置一个公有接口。
自己写了一个程序例子,觉得很清楚了(这里还涉及到了静态联编):

#include
using namespace std;
class Base {
public:
	int n1;
	Base(int a, int b) :n1(a), n2(b) { cout << "基类构造函数被调用" << endl; }
	void display_n1_n2() { cout<<"n1=" << n1 << "," <<"n2="<< n2 << endl; }
	void reset_n2(int x) { n2 = x; cout << "重置后的n2=" << n2 << endl; }
private:
	int n2;
};
class Derived :public Base {
private:
	int n3;
public:
	Derived(int a, int b, int c) :Base(a, b), n3(c) { cout << "派生类构造函数被调用" << endl; }
	//void reset_n2(int x) { n2 = x; }//这样写是错误的
	void reset_n2(int x) { Base::reset_n2(x); }//这样写是可行的
};
int main() {
	Base b(4, 5);
	Derived d(1, 2, 3);
	d.display_n1_n2();
	d.reset_n2(6);

	b = d;//派生类对象隐含转换为基类对象,即用派生类对象中从基类继承来的成员,逐个赋值给基类对象的成员

	b.display_n1_n2();
	system("pause");
	return 0;
}

派生类的对象赋值给基类对象_第1张图片
1.因为基类的n2是private,所以在派生类中无法访问,所以如果硬要在派生类中对n2的值进行修改,只能在基类中设置一个公有接口函数,在该函数中对n2的值进行修改,最后派生类对象调用该基类的公有函数。void reset_n2(int x) { Base::reset_n2(x); }//这样写是可行的void reset_n2(int x) { n2 = x; }//这样写是错误的,n2在派生类中是不可访问的
2.派生类的对象赋值给基类对象,即用派生类对象中从基类继承来的成员,逐个赋值给基类对象的成员。所以b = d;实现的就是把d中的n1、n2赋值给b中的n1、n2。

你可能感兴趣的:(Effective,C++阅读笔记)