1. 多态性:抽象类和派生类
(1) 定义一个抽象类CShape (至少有一个函数被声明为纯虚函数);
(2) 再利用CShape分别定义两个派生类CRectangle(矩形)和CCircle(圆), 三个类都有计算面积的成员函数GetArea()和计算对象周长的成员函数GetPerimeter() ;
(3) 在主函数中声明基类指针和派生类对象,并通过基类指针调用不同对象的成员函数GetArea() 和GetPerimeter()。
问题1:什么是纯虚函数
解决:纯虚函数的主要作用是定义一个接口,强制派生类提供特定的实现。给派生的基类提供一个特殊的接口来实现多态性。eg.
// 抽象基类
class Shape {
public:
// 纯虚函数 virtual void draw() const = 0;
// 虚析构函数 virtual ~Shape() {} };
问题2:子类中的函数定义
解决:eg:void draw() const override { std::cout << "绘制一个矩形" << std::endl;
override的意思是告诉编译器是从基类的虚函数继承下来的重写版本。
问题3: void GetArea(int l,int w) override{
int area=0;
length=l;
width=w;
area=l*w;
std::cout<<area<<std::endl;
};14 12 C:\c++\2024 4 7\CShape.h [Error] 'void CRectangle::GetArea(int, int)' marked override, but does not override
这里的报错显示并没有覆盖基类的虚函数而是在派生类定义了一个新的函数,如何才能使基类的函数被覆盖。
解决:将派生类的定义单独拿出来,将基类函数和派生类函数的形式一制化;
问题4: void CRectangle(int l,int w):length(l),width(w){
};
解决:类的构造函数不需要void
在派生类覆盖基类的纯虚函数是一定要对应包括const
问题五:如何定义派生类对象;
解决: eg. CRectangle rectangle(3,4);
CCircle circle(5);
最终版:
#include <iostream>
class CShape{
public:
virtual double GetArea()const=0;//纯虚函数
virtual double GetPerimeter()const=0;
virtual ~CShape(){}
};
class CRectangle:public CShape{
int length;
int width;
public:
CRectangle(int l,int w):length(l),width(w){
};
virtual double GetArea() const override{
return length*width;
};
virtual double GetPerimeter()const override{
return 2*(length+width);
};
};
class CCircle:public CShape{
int radium;
public:
CCircle(int r):radium(r){
};
virtual double GetArea() const override{
return radium*radium*3.14;
};
virtual double GetPerimeter() const override{
return 2*3.14*radium;
};
};
#include <iostream>
#include "CShape.h"
int main (){
CShape *shape1;
CShape *shape2;
CRectangle rectangle(3,4);
CCircle circle(5);
shape1=&rectangle;
shape2=&circle;
std::cout<<"the rectangle area : "<<shape1->GetArea()<<std::endl;
std::cout<<"the rectangle Perimeter : "<<shape1->GetPerimeter()<<std::endl;
std::cout<<"the circle area : "<<shape2->GetArea()<<std::endl;
std::cout<<"the circle Perimeter : "<<shape2->GetPerimeter()<<std::endl;
}
标签:const,函数,int,多态性,c++,2024,override,派生类,CShape From: https://blog.csdn.net/tzzzzzh/article/details/137467797