C++——关于继承的一些补充
2023-12-15 09:13:14
一,关于切割
class Person1
{
public:
void Print()
{
cout << "name:" << _name << endl;
cout << "age:" << _age << endl;
}
protected:
string _name = "peter";//姓名
int _age = 18;//年龄
};
class Student1 : public Person1
{
protected:
int _stuid;
};
void main1()
{
Student1 s;
s.Print();
}
//基类和派生类的对象赋值转换
void main2()
{
Student1 s;
Person1 p = s; //将子类中和父类相同的那一段切出来拷贝过去
Person1& rp = s; //无隐式类型转换,无临时变量产生,这个引用是父类切出来那一部分的别名,注意是指向父类的,没有新对象产生
Person1* pp = &s;//也是指向父类那一部分的指针,无对象产生
Student1* ps = (Student1*)pp;
ps->Print();
}
使用父类对象拷贝子类时,会将子类中父类继承下来的那部分内容切出来拷贝一份给父类,中间新对象产生,用父类引用或指针时没有新对象产生,父类指针或引用只代表了子类对象中从父类继承下来的那一部分,所以用父类指针或引用去改变值的时候,会改变子类的值
?二,继承下的默认成员函数调用补充
class Person3
{
public:
Person3(const char* name = "peter")
:_name(name)
{
cout << "Person()" << endl;
}
Person3(const Person3& p)
:_name(p._name)
{
cout << "Person(const Person& p)" << endl;
}
Person3& operator=(const Person3& p)
{
cout << "Person& operator=(const Person& p)" << endl;
if (this != &p)
_name = p._name;
return *this;
}
~Person3() {}
protected:
string _name;
};
class Student3 : public Person3
{
public:
Student3(const char* name = "张三", int num = 10)
:Person3(name)
, _num(num)
{
cout << "Student()" << endl;
}
Student3(const Student3& s)
:Person3(s)
,_num(s._num)
{
cout << "Student(const Student&)" << endl;
}
Student3& operator=(const Student3& s)
{
cout << "Student& operator=(const Student& s)" << endl;
if (this != &s)
{
Person3::operator=(s);
_num = s._num;
}
return *this;
}
//子类的析构函数跟父类的析构函数构成隐藏。
//由于后面多态的需要,析构函数名字会被统一处理为destructtor()
~Student3()
{
//Person::~Person();不需要显示调用,因为会自动调用
// 不需要显示调用父类析构函数
// 每个子类析构函数后面,会自动调用父类析构函数,这样才能保证先析构子类,再析构父类
//...子类处理自己的
}
Student3* operator&()
{
return this;
}
protected:
int _num;
};
void main()
{
Student3 s1; //子类调用父类和自己的构造
Student3 s2(s1); //调用父类和子类的拷贝构造
cout << "-----------------" << endl;
Person3 p = s1; //切割,只调用父类的拷贝构造
Student3 s3;
s3 = s1; //赋值,调用父类和子类的operator=()
}
?
文章来源:https://blog.csdn.net/aaqq800520/article/details/134951418
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!