前言
C++与C最大的不同是面向对象。虽然我了解一些有关面向对象的概念,写过一些函数,可惜实际中很少用到。本文是C++ Primer第15章的快速总结。
概述
面向对象程序设计又称为OOP,其核心思想是:数据抽象、继承和动态绑定。数据抽象指的是,声明与实现分离,继承指的是子类获得父类的所有成员,动态绑定是调用类的函数时根据类的不同进行区别调用。
声明基类与派生类
下面的代码进行简单的示例,声明了一个基类animal与派生类cat。
#include <stdio.h>
#include <iostream>
class animal
{
public:
virtual void eat(){};
};
class cat : public animal
{
public:
void eat() { std::cout << "eat fish" << std::endl; }
};
int main()
{
cat c;
c.eat();
}
类型转换与继承
派生类的指针和引用可以转为基类的指针或引用,基类的指针或引用不能转化为派生类的指针或引用。这意味着,一个基类的指针,指向的对象,有可能是基类,也有可能是派生类,但肯定不是基类的父类。
派生类对象可以赋值给基类,但只会拷贝基类的部分。
虚函数
虚函数在运行时进行解析。我们继续上面的例子,假如我们写了一个新的函数,是doeat,内部调用了animal的eat方法。eat对animal是eat meat or grass,但是最后显示的结果是eat fish。这就证明了,在运行时,doeat函数调用animal的eat方法时,eat方法找到了引用对象的真实对象cat的eat方法并进行了调用。
class animal
{
public:
virtual void eat() { std::cout << "eat meat or grass" << std::endl; };
};
class cat : public animal
{
public:
void eat() { std::cout << "eat fish" << std::endl; }
};
void doeat(animal &a) { a.eat(); }
int main()
{
cat c;
doeat(c);
}
另外,为了养成良好的习惯,在派生类中最好使用override来显式的声明覆盖的虚函数。
纯虚函数
在定义虚函数后赋值为0则声明了纯虚函数,纯虚函数相当于接口,派生类必须实现该接口。
抽象基类
含有纯虚函数的类是抽象基类。抽象基类不能创建。
示例 文本行查询程序
给定一段文本,要求查询其中的内容。支持单词查询、逻辑查询。
网友评论