1、继承相关函数功能实现
实现一个图形类(Shape),包含受保护成员属性:周长、面积,公共成员函数:特殊成员函数
定义一个圆形类(Circle),继承自图形类,包含私有属性:半径,公共成员函数:特殊成员函数、以及获取周长、获取面积函数
定义一个矩形类(Rect),继承自图形类,包含私有属性:长度、宽度,公共成员函数:特殊成员函数、以及获取周长、获取面积函数
在主函数中,分别实例化圆形类对象以及矩形类对象,并测试相关的成员函数。
#include <iostream>
using namespace std;
//1、图形类
class Shape
{
protected:
double perimeter; //周长
double area; //面积
public:
Shape(){} //无参构造
Shape(double a,double b):perimeter(a),area(b)
{cout<<"Shape::有参构造"<<endl;}
};
//2、定义一个圆形类(派生类),继承图形
class Circle:public Shape
{
private:
double r; //半径
public:
Circle(){} //无参构造
Circle(double radius) : Shape(2 * 3.14 * radius, radius * radius*3.14),r(radius) {}
~Circle() { cout << "Circle destructor" << endl;}
//获取周长
double Cir_perimeter()
{
return perimeter=2*3.14*r;
}
//获取面积
double Cir_area()
{
return area=r*r*3.14;
}
};
//3、矩形类
class Rect:public Shape
{
private:
double l; //长度
double k; //宽度
public:
Rect(){} //无参构造
Rect(double m,double n) : Shape((m+n)*2, m*n),l(m),k(n) {}
~Rect() {
cout << "Rect destructor" << endl;
}
//获取周长
double R_perimeter()
{
return (l+k)*2;
}
//获取面积
double R_area()
{
return area=l*k;
}
};
int main()
{
//调用圆形相关函数
Circle c1(3);
cout << "Circle perimeter: " << c1.Cir_perimeter() << endl;
cout << "Circle area: " << c1.Cir_area() << endl;
//调用方形相关函数
Rect r1(4,5);
cout << "Rect perimeter: " << r1.R_perimeter() << endl;
cout << "Rect area: " << r1.R_area() << endl;
return 0;
}
这段代码实现了一个简单的图形类和圆形、矩形两个派生类。
其中,图形类有周长和面积两个成员变量,圆形类和矩形类分别继承了图形类,并重写了计算周长和面积的函数。在主函数中,通过创建圆形和矩形对象,调用相应的函数来计算周长和面积并输出结果。
考察知识点:继承、特殊成员函数
2、笔试面试常见题型之c++
(1)面向对象的三大特征
面向对象的三大特征:封装、继承、多态,如果有第四大特征,外加一个抽象
(2)什么是命名空间,为什么要使用命名空间
主要作用是解决多人协同开发程序时名字污染(名字冲突)问题
所谓命名空间,其实相当于给名字加个“姓氏”
(3)谈谈C++中的友元
友元包括友元函数和友元类,全局函数作为友元函数格式:在类内进行全局函数的声明:friend 函数头;
-友元是单向的,A将B设置成友元,则A允许B访问自己的成员,而B不一定允许A访问其成员
-友元不具有传递性:A是B的朋友,B是C的朋友,那么A不一定是C的朋友
-友元不具有继承性:父类的朋友不一定是子类的朋友
-友元破坏了类的封装性,使得访问权限形同虚设,所以不在万不得已的情况下,尽可能不使用友元
-必须使用友元的情况:插入和提取运算符重载时,需要使用全局函数作为友元函数
(4)C++中的类提供的特殊成员函数有哪些
系统提供---为什么要显性定义-----情况
析构函数:类对象----类对象以外的成员----显性对像
(6)C++中的静态成员函数和静态成员变量
回答步骤:为什么使用静态成员、静态成员如何定义、静态成员如何使用
静态成员与非静态成员的区别
(6)C++中深浅拷贝问题
回答步骤:发生的背景、浅拷贝、浅拷贝的缺陷、深拷贝如何实现
1、在一个类中,如果没有显性定义拷贝构造函数,系统会默认提供一个拷贝构造函数,来完成类对象之间的简单赋值,这个拷贝构造函数是一个浅拷贝,如果类中无指针成员,那么使用该拷贝构造函数没有问题
2、如果类中有指针成员并且指向堆区空间,使用浅拷贝就会造成对同一个堆区空间的多次释放问题,会产生double free的段错误
3、此时就需要显性定义拷贝构造函数完成深拷贝:在拷贝构造函数的初始化列表中,给自己的指针成员重新申请出一个空间,将原对象的指针成员指向的空间内容赋值过来,即可完成深拷贝
知识总结: