1. C++中的多态和虚函数
在C++中,多态性是指一个类和其子类对象中的同名函数被用于不同的情况下能够表现出不同的行为。多态性主要体现在以下两种方式:
1.1 静态多态
静态多态性,即函数重载,可以让我们在一个类中定义有相同名称但参数类型、个数不同的多个函数,从而提高程序的可读性和健壮性。
下面我们随机定义一个类,并进行函数重载,来看看静态多态性的实现过程:
class Shape
{
public:
void draw();
void draw(int);
};
void Shape::draw()
{
std::cout << "This is a shape." << std::endl;
}
void Shape::draw(int n)
{
std::cout << "This is a shape with " << n << " edges." << std::endl;
}
int main()
{
Shape s;
s.draw();
s.draw(4);
return 0;
}
以上代码输出结果为:
This is a shape.
This is a shape with 4 edges.
1.2 动态多态
动态多态性,即使用虚函数和RTTI实现的多态性,可以让我们在运行时确定对象类型,从而实现调用相应对象的同名函数,从而实现不同行为的表现。
以下代码是一个简单的实现了动态多态性的例子:
class Shape
{
public:
virtual void draw() const
{
std::cout << "This is a shape." << std::endl;
}
};
class Circle : public Shape
{
public:
void draw() const override
{
std::cout << "This is a circle." << std::endl;
}
};
class Triangle : public Shape
{
public:
void draw() const override
{
std::cout << "This is a triangle." << std::endl;
}
};
int main()
{
Shape* s[3] = {new Circle(), new Triangle(), new Shape()};
for (int i = 0; i < 3; i++)
s[i] -> draw();
return 0;
}
上述代码输出结果为:
This is a circle.
This is a triangle.
This is a shape.
2. override说明符
C++11新特性 override 关键字可以帮助我们更好地使用虚函数和多态,override可以强制子类对虚函数进行覆盖,保证了在子类中正确实现父类的虚函数。
以下是 override 的使用举例:
class Shape
{
public:
virtual void draw() const
{
std::cout << "This is a shape." << std::endl;
}
};
class Circle : public Shape
{
public:
void draw() const override
{
std::cout << "This is a circle." << std::endl;
}
};
class Triangle : public Shape
{
public:
void draw() const override
{
std::cout << "This is a triangle." << std::endl;
}
};
class Rectangle : public Shape
{
public:
void display() const
{
std::cout << "This is a rectangle." << std::endl;
}
void draw() const override
{
std::cout << "The display of a rectangle." << std::endl;
}
};
int main()
{
Shape* s[4] = {new Circle(), new Triangle(), new Shape(), new Rectangle()};
for (int i = 0; i < 4; i++)
s[i] -> draw();
return 0;
}
通过使用 override,我们可以在 Rectangle 类中正确地实现并覆盖 Shape 类的虚函数,在程序中也能正常运行。不使用 override,程序编译不会产生错误,但是结果将会错误,故使用 override 是十分必要的。