C++入门(11):高级OOP技术:虚方法和抽象方法
直接创建一个指针并让它指向新分配的内存块:type *pointName = new type;
,一定要记着释放刚才分配的那个内存块:delete pointName;
,否则会造成内存泄露。
虚方法
为了让编译器知道它应该根据指针在运行时的类型而有选择地调用正确的方法,就必须把这些方法声明为虚方法;
声明一个虚方法只要在其原型的前面加上 virtual 保留字即可:virtual void play();
虚方法是继承性的:一旦在基类里把某个方法声明为虚方法,在子类里就不可能再把它声明为一个非虚方法了;
在基类里把所有方法都声明为虚方法会让最终生成的可执行代码的速度变得稍微慢一点。
析构器都是虚方法。如果不是,编译器就会根据它们在编译时的类型而调用那个在基类里定义的版本(基类的构造器);这往往会导致内存泄露。
在实现一个多层次的类继承关系的时候,最顶级的基类应该只有虚方法;
静态方法不可能是虚方法,虚方法也不可能是静态方法 。
抽象方法
在设计一个多层次的类继承关系时经常会用到抽象方法;
把某个方法声明为一个抽象方法是在告诉编译器:这个方法不可缺少。但现在(在这个基类里)还不能为它提供一个实现;即:要想使用某个抽象方法,就必须在子类里实现它。
抽象方法的声明:在声明一个虚方法的基础上,在原型的末尾加上=0
。
如果在某个类里有一个抽象方法,那它必须至少还有一个普通的虚方法才行!!
抽象化(也称纯虚化)可以在不破坏整体设计思路和代码结构的情况下删除那些没有什么实际用途的代码;
多态(polymorphism)
多态用来描述:程序员可以编写出能够对多种不同的数据类型进行处理的函数。
下面通过代码举例来深入理解类的虚方法和抽象方法:
#include <iostream>
#include <string>
class Pet{
public:
Pet(std::string theName);
~Pet();
void eat();
virtual void sleep(); //至少还有一个普通的虚方法!!
virtual void play() = 0; //抽象方法,删除基类中 play() 方法的实现
protected:
std::string name;
};
class Dog : public Pet{
public:
Dog(std::string theName);
void bark();
void play();
};
Pet::Pet(std::string theName)
{
name = theName;
std::cout << "Create a pet named " << name << std::endl;
}
Pet::~Pet()
{
std::cout << "Delete the pet named " << name << std::endl;
}
void Pet::eat()
{
std::cout << "The pet named " << name <<" is eating..." << std::endl;
}
void Pet::sleep()
{
std::cout << "The pet is sleeping..." << std::endl;
}
Dog::Dog(std::string theName):Pet(theName)
{
}
void Dog::bark()
{
std::cout << "The dog named " << name << " is barking..." << std::endl;
}
void Dog::sleep() //虚方法
{
std::cout << "The dog is sleeping..." << std::endl;
}
void Dog::play() //play()成为抽象方法后,要想实现这个功能,必须在子类实现
{
std::cout << "The dog is playing..." << std::endl;
}
int main(int argc, char** argv) {
/*编译程序的时候,编译器会认为这个指针的类型是Pet,而不是Dog,使用虚方法后,可以在它们运行时有选择得调用正确的方法。*/
Pet *dog = new Dog("LittleSeven");
dog->eat();
dog->sleep() ; //调用的是Dog类中的sleep()方法
dog->play();
delete dog;
return 0;
}
运行结果为:
Create a pet named LittleSeven
The pet named LittleSeven is eating...
The dog is sleeping...
The dog is playing...
Delete the pet named LittleSeven