C++继承与派生(2)

公有继承与私有继承区别:
公有继承强调是一个的概念,比如:学生是一个人,研究生是一个学生等等。私有继承强调的组成概念,比如:汽车是由发动机以及其他部件组成,而不能说汽车是一个发动机或者发动机是一个汽车。

公有继承:

在公有继承中,存在赋值兼容性规则。可以将派生类的对象赋值给基类的对象或引用,也可以将派生类的地址赋值给基类指针:

class Person
{
private:
	int id_num;
public:
	Person(int id=0) :id_num(id)
	{

	}
	~Person(){}
	void fun_p()
	{
		cout << "work" << endl;
	}
};

class Student : public Person
{
private:
	int s_num;
public:
	Student(int id=0, int num=0) :Person(id), s_num(num)
	{
	}
	~Student(){}
	void fun_s()
	{
		cout << "study" << endl;
	}
};

int main()
{
	Student st;
	Person p1 = st;
	Person& p2 = st;
	Person* p3 = &st;
	p3->fun_p();
	return 0;
}

赋值的时候,会产生切片现象。

只将上半部分赋值给基类对象。相反的,基类对象不允许赋值给派生类对象,因为赋值的时候s_num无法初始化。 

拷贝构造与赋值运算符的重载:

拷贝构造函数与赋值运算符重载函数不会被复制到派生类,所以在调用派生类的拷贝构造函数时需要调用基类的拷贝构造函数。需要注意的是:

1.程序设计者在基类和派生类中都没有定义拷贝构造函数C++编器将自动产生按位拷贝的拷贝构造函数,在派生类的拷贝构造函数的初始化表中,加入基类拷贝构造函数的调用,是C++编译器合成的代码;(完成行为的统一) 
2.程序设计者在基类中定义拷贝构造函数,而在派生类中没有定义拷贝构造函数;C++编译器将会在派生类中自动产生按位拷贝的拷贝构造函数。并合成代码,调用(关联) 基类的拷贝构造函数
3.程席设计者在基类和派生类中都定义了堵贝构造函数:程序设计者在派生类中,没有指定调用基类的接贝构造函数时。C++编译器合成的代码调用基类的缺省构造函数,如果基类中没有缺省构造函数。合成代码失败。编译错误。
4.程序设计者在基类中没有定义拷贝构造函数 (C++编译器将自动产生按位拷贝的拷贝构造函数)。而在派生类中定义了拷贝构造函数。程序设计者在派生类中,没有指定调用基类的拷贝构造函数时。C++编译器合成的代码调用基类的缺省构造函数,如果基类中没有缺省构造函数

赋值运算符:

1.程序设计者在基类和派生类中都没有重载operator=函数; C++编译器将在基类和派生类中自动产生按位赋值的,重载operator=函数,C++编译器会在派生类的重载赋值函数中,加入基类重载赋值函数的调用,是C++编译器合成的代码; (完成行为的统一) ;
2.程序设计者在基类中定义重载赋值函数,而在派生类中没有定义重载赋值函数;C++编译器将会在派生类中自动产生按位赋值的重载赋值函数。并合成代码,调用(关联) 基类的重载赋值函数
3,程序设计者在基类和派生类中都定义了重载赋值函数:程序设计者在派生类中,没有指定调用基类的重载赋值函数时。C++编译器
不会合成调用基类的重载赋值函数的代码。要在派生类的重载赋值函数调用基类的重载赋值函数,程序设计者必须自己加入调用代码。
4.程序设计者在基类中没有定义重载赋值函数 (C++编译器将自动产生按位赋值的重载赋值函数)。而在派生类中定义了重载赋值函数。程序设计者在派生类中,没有指定调用基类的重载赋值函数。C++编译器
不会合成调用基类的重载赋值函数的代码

友元函数并不具有传递性,也不会被继承。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您介绍一下 C++继承派生的相关知识,并且给您一个定义 Employee 类的示例代码。 在 C++ 中,继承是一种重要的面向对象编程技术,它允许我们在一个类的基础上定义另一个类。被继承的类称为基类或父类,继承的类称为派生类或子类。派生类可以继承父类的成员变量和成员函数,并且还可以添加自己的成员变量和成员函数。 下面是一个定义 Employee 类的示例代码: ```c++ // Employee 类的定义 class Employee { public: Employee(string name, int age, string gender, double salary); virtual ~Employee(); virtual void display() const; protected: string name_; int age_; string gender_; double salary_; }; // Manager 类的定义,它是 Employee 类的派生类 class Manager : public Employee { public: Manager(string name, int age, string gender, double salary, string department); virtual ~Manager(); virtual void display() const; private: string department_; }; ``` 在上面的代码中,Employee 类包含了一些基本的成员变量和成员函数,如姓名、年龄、性别和薪水,以及一个虚函数 display()。Manager 类是 Employee 类的派生类,它继承了 Employee 类的所有成员变量和成员函数,并且添加了一个部门名称的成员变量 department_ 和一个重载了 display() 函数的成员函数。 请注意,Employee 类的析构函数和 display() 函数都是虚函数,这是因为我们希望在派生类中重载这些函数时能够正确地调用它们。 以上是一个简单的继承派生示例,希望能够帮助您更好地了解 C++ 中的面向对象编程技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

g162512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值