多态性 C++中实现运行时多态的方式
什么是多态性
多态性是指同一个指令可以作用于不同类型的对象并获得不同的结果的能力。在C++中,多态性是通过继承、虚函数、引用和指针等机制来实现运行时多态的。
继承和多态性
继承是一种实现代码重用和抽象的机制,它也是实现多态性的基础。我们可以在基类中定义一个虚函数,派生类中重写该函数,从而实现多态性。以下是一个简单的示例:
class Shape {
public:
virtual void Draw() {
std::cout << "Draw shape" << std::endl;
}
};
class Circle : public Shape {
public:
void Draw() {
std::cout << "Draw circle" << std::endl;
}
};
class Rectangle : public Shape {
public:
void Draw() {
std::cout << "Draw rectangle" << std::endl;
}
};
int main() {
Shape* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->Draw();
shape2->Draw();
delete shape1;
delete shape2;
return 0;
}
运行结果为:
Draw circle
Draw rectangle
可以看到,shape1和shape2虽然都是Shape类型的指针,但是在运行时调用Draw函数时,根据实际类型进行了不同的操作。
虚函数和多态性
虚函数是实现多态性的重要机制。在基类中定义虚函数,派生类可以继承和重写该函数。当使用基类指针或引用调用虚函数时,程序会根据对象的实际类型来调用相应的函数,从而实现多态性。
以下是一个虚函数的简单示例:
class Shape {
public:
virtual void Draw() {
std::cout << "Draw shape" << std::endl;
}
};
class Circle : public Shape {
public:
void Draw() {
std::cout << "Draw circle" << std::endl;
}
};
int main() {
Shape* shape = new Circle();
shape->Draw();
delete shape;
return 0;
}
运行结果为:
Draw circle
可以看到,当使用Shape类型指针调用Draw函数时,实际调用的是Circle类中的Draw函数,在运行时决定了函数被调用的实际类型。
指针和引用实现多态性
除了继承和虚函数,C++中的指针和引用也可以用来实现多态性。根据指针或引用的实际类型,程序会动态决定调用相应的函数。
以下是一个使用引用的简单示例:
class Shape {
public:
virtual void Draw() {
std::cout << "Draw shape" << std::endl;
}
};
class Circle : public Shape {
public:
void Draw() {
std::cout << "Draw circle" << std::endl;
}
};
void MyDraw(Shape& shape) {
shape.Draw();
}
int main() {
Circle circle;
MyDraw(circle);
return 0;
}
运行结果为:
Draw circle
可以看到,使用MyDraw函数时,实参为Circle类型对象,但是形参为Shape类型的引用,程序在运行时决定调用相应的函数,实现了多态性。
- 上一篇
c语言编程中怎么实现两个二维数
了解二维数组在开始讲解两个二维数组如何实现之前,先来了解一下什么是二维数组。二维数组是指数组中的元素又是一个数组,也就是说,一个数组中包含了多个数组,每个数组都是一维数组。在C语言中,我们可以通过以下方式定义一个二维数组:intarray[row][column];其中,row表示数组的行数,column表示数组的列数。在定义数组时
- 下一篇
c语言编程输出三角形乘法表
什么是三角形乘法表三角形乘法表是一种将乘法表以三角形的形式呈现出来的方法,通过这种方法可以更加直观地理解乘法表的规律。如何编写C语言输出三角形乘法表程序下面是一个输出3行的三角形乘法表的C语言程序:```c#includeintmain(){inti,j;for(i=1;i以上程序中,我们使用了两个for循环来控制输出的行数和每行输出的数的个数,其中第一个for循环控制行数,第二个for循环控制每