虚拟继承和模板继承

来源:互联网 发布:淘宝登录 编辑:程序博客网 时间:2024/05/01 12:20

虚拟继承代码:

class B1{public:    void SayHi()    {        PrintClassName();    }protected:    virtual void PrintClassName()    {        printf("This is B1. \n");    }};class D1 : public B1{};class D2 : public B1{protected:    virtual void PrintClassName()    {        printf("This is D2. \n");    }};int _tmain(int argc, _TCHAR* argv[]){    D1 d1;    D2 d2;    d1.SayHi();    d2.SayHi();    getchar();    return 0;}

模板继承代码:

template<class T>class B1{public:    void SayHi()    {        T* pT = static_cast<T*>(this);        pT->PrintClassName();    }protected:    void PrintClassName()    {        printf("This is B1. \n");    }};class D1 : public B1<D1>{};class D2 : public B1<D2>{public:    void PrintClassName()    {        printf("This is D2. \n");    }};int _tmain(int argc, _TCHAR* argv[]){    D1 d1;    D2 d2;    d1.SayHi();    d2.SayHi();    getchar();    return 0;}

模板继承的优点:
1) 不需要使用对象的指针
2) 节省内存,因为不需要使用虚函数表
3) 不会因为未初始化的虚函数表导致使用NULL指针
4) 所有函数的调用在编译时确定,因此它们是可以优化的。

0 0