遇到了一些麻烦的,记录下来作为教训…..
1. 虚函数的声明和定义
具体关于虚函数的知识不做多讲,我在定义一个抽象类时,忘了将一个虚函数声明为 纯虚函数,又没有对其定义, 导致编译报错时报错如下:
undefined reference to `vtable for Fibonacci'
错误提示的很明显,就是无法生成虚函数表。
我们知道,虚函数表(地址)在定义了虚函数的类所实例化的对象内存中的第一个位置,也就是在实例化过程中生成了虚表。这个错误提示在stackflow中最常见的解答就是类中声明了虚函数,却没有定义。
总结一下虚函数声明和定义的规则如下:
类中的virtual函数,要么设为纯虚函数,要么有定义,否则无法生成虚函数表。
- 虚函数的可以类外定义,但是必须加上类名,类外定义不需要加virtual
- 声明为纯虚函数,则类为抽象类,无法实例化,进一步强调,想要实例化有虚函数的类,必须对虚函数进行定义
基类定义为虚函数,则子类同名函数也为虚函数,无论是否有virtual关键字修饰(一般声明时加virtual,便于阅读)
凡是基类定义有虚函数,则基类需要定义虚析构函数(根据上一条法则,虚析构函数要么有定义,要么纯虚,一般不设为纯虚,可以定义空白)
虚函数通过虚表实现,虚表是类实例化时生成在对象中的(虚表地址),所以如果一个类能够实例化,则其虚函数必须有定义,如果不想定义虚函数,只能声明为纯虚函数,留给子类定义。
举例如下:
基类为一个抽象类
// num_sequence.h
#ifndef _NUM_SEQUENCE
#define _NUM_SEQUENCE
#include <string>
#include <iostream>
using namespace std;
class num_sequence {
public:
num_sequence() {
cout << " create a num sequence" << endl;
}
virtual ~num_sequence() {
cout << "~num_sequence has been called" << endl;