[C++基础] 虚函数

《C++语言的设计和演化》

中相关章节:

3.5 虚函数

需要虚函数的理由?

实现机制?

最关键的实现思想, 就是把在一个类里定义的一集虚函数定义为一个指向函数的指针数组. 这样, 对虚函数的调用简单地也就是通过该数组一个间接函数调用.

对每个有虚函数的类都存在一个这样的数组, 一般称为虚函数表或者vtbl. 这些类的每个对象都包含一个隐式指针, 一般称为vprt, 指向该对象的类的虚函数表.

一篇与Java的比较: JAVA – 虚函数、抽象函数、抽象类、接口 —— 还没认真看...

#include <iostream>
using namespace std;

class Base {
protected:
    int ID;
public:
    Base() {
        ID = GenerateID();
    }
    virtual int GenerateID() {
        return 1;
    }
    int GetID() {
        return ID;
    }
};

class Derived: public Base {
public:
    Derived() {
    }
    int GenerateID() {
        return 2;
    }
};

int main() {
    Derived cDerived; // 原来不一定要用new啊...
    cout << cDerived.GetID();
    return 0;
}
// 1

C++ Virtual详解

#include <iostream>
using namespace std;

class A {
public:
    virtual void f() { cout << "A::f() "; }
    void f() const { cout << "A::f() const ";}
    virtual ~A() {}
};

class B: public A {
public:
    void f() { cout << "B::f() "; }
    void f() const { cout << "B::f() const "; }
    virtual ~B() {}
};

void g(const A* a) {
    a->f();
}

int main(int argc, char *argv[]) {
    A* p = new B();
    p->f();
    g(p);
    delete(p);
    return 0;
}
// B::f() A::f() const