父类函数不加virtual关键词,子类继承后,当父类指针指向子类指针,同样的函数,会执行父类的函数。子类的函数实际是被隐藏了,如果用子类的指针指向自己的话,是能够执行的。
#include <iostream>
/**
* C++多态 虚函数
*/
using namespace std;
class Shape {
public:
Shape();
~Shape();
double calcArea();
};
class Circle : public Shape {
public:
Circle(double r);
~Circle();
double calcArea();
protected:
double m_dR;
protected:
string m_strName;
};
class Rect : public Shape {
public:
Rect(double width, double height);
~Rect();
double calcArea();
protected:
double m_dWidth;
double m_dHeight;
};
Rect::Rect(double width, double height) {
m_dHeight = height;
m_dWidth = width;
cout << "Rect::Rect()" << endl;
}
double Rect::calcArea() {
cout << "Rect::calcArea()" << endl;
return m_dWidth*m_dHeight;
}
Rect::~Rect() {
cout << "~Rect()" << endl;
}
Circle::Circle(double r) {
m_dR = r;
cout << "Circle()" << endl;
}
double Circle::calcArea() {
cout << "Circle::calcArea()" << endl;
return 3.14 * m_dR * m_dR;
}
Circle::~Circle() {
cout << "~Circle()" << endl;
}
Shape::Shape() {
cout << "Shape()" << endl;
}
Shape::~Shape() {
cout << "~Shape()" << endl;
}
double Shape::calcArea() {
cout << "Shape::clacArea()" << endl;
}
int main() {
Shape *shape=new Rect(3,6);
Shape *shape1=new Circle(5);
shape->calcArea();
shape1->calcArea();
delete(shape);
delete(shape1);
return 0;
}
运行的结果
Shape() Rect::Rect() Shape() Circle() Shape::clacArea() //父类的方法 Shape::clacArea() //父类的方法 ~Shape() ~Shape()
加上virtual关键词后
#include <iostream>
/**
* C++多态 虚函数
*/
using namespace std;
class Shape {
public:
Shape();
~Shape();
virtual double calcArea();
};
//虚继承
class Circle : public Shape {
public:
Circle(double r);
~Circle();
double calcArea();
protected:
double m_dR;
protected:
string m_strName;
};
//虚继承
class Rect : public Shape {
public:
Rect(double width, double height);
~Rect();
double calcArea();
protected:
double m_dWidth;
double m_dHeight;
};
Rect::Rect(double width, double height) {
m_dHeight = height;
m_dWidth = width;
cout << "Rect::Rect()" << endl;
}
double Rect::calcArea() {
cout << "Rect::calcArea()" << endl;
return m_dWidth*m_dHeight;
}
Rect::~Rect() {
cout << "~Rect()" << endl;
}
Circle::Circle(double r) {
m_dR = r;
cout << "Circle()" << endl;
}
double Circle::calcArea() {
cout << "Circle::calcArea()" << endl;
return 3.14 * m_dR * m_dR;
}
Circle::~Circle() {
cout << "~Circle()" << endl;
}
Shape::Shape() {
cout << "Shape()" << endl;
}
Shape::~Shape() {
cout << "~Shape()" << endl;
}
double Shape::calcArea() {
cout << "Shape::clacArea()" << endl;
}
int main() {
Shape *shape=new Rect(3,6);
Shape *shape1=new Circle(5);
shape->calcArea();
shape1->calcArea();
delete(shape);
delete(shape1);
return 0;
}
运行结果
Shape() Rect::Rect() Shape() Circle() Rect::calcArea() //子类自己的函数 Circle::calcArea()//子类自己的函数 ~Shape() ~Shape()