C++学习记录-面向对象-虚函数纯虚函数抽象类

一、虚函数的作用

先来创建一个类:

1
2
3
4
5
6
7
class chara {
public:
void print()
{
cout << "这是角色类" << endl;
}
};

再来一个类继承它:

1
2
3
4
5
6
7
class qyn :public chara {
public:
void print()
{
cout << "琪亚娜" << endl;
}
};

进行调试:

1
2
3
4
5
6
7
8
9
10
void test(chara& a)
{
a.print();
}

int main()
{
qyn q;
test(q);
}

此处的test函数要求传入一个chara类的引用,但传入的是继承自chara类的qyn类

运行结果是调用了chara类的print函数而不是调用qyn类里的

想要让父类的引用或指针指向子类对象时能调用子类的函数,应使用虚函数

进行修改如下:

1
2
3
4
5
6
7
class chara {
public:
virtual void print()
{
cout << "这是角色类" << endl;
}
};
1
2
3
4
5
6
7
class qyn :public chara {
public:
virtual void print()
{
cout << "琪亚娜" << endl;
}
};

将父类的print函数定义为虚函数,即在前面加上virtual

这样当父类的引用或指针指向子类对象时,也能调用子类重写的父类的函数

二、

  • 虚函数是实现动态多态的机制

    附:动态多态:即运行时的多态,在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法

  • 动态多态的条件,一是要有继承关系,二是子类要重写父类的虚函数

  • 虚函数的使用场景:父类指针或引用指向子类对象时

三、纯虚函数和抽象类

  • 纯虚函数:

    1
    virtual void print()=0;

    不写函数定义,只在后面写等于0,这个函数就变成了纯虚函数

  • 抽象类:包含有纯虚函数的类就是抽象类

    抽象类只能用于继承,不能用于实例化对象

    子类继承自抽象类时,必须重写抽象类中的纯虚函数才可以用于实例化,否则它又是一个抽象类