洛翼mwk

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

class A{};

class B:public A{};

这是继承

注意事项:

例:

class A{public : A(int);};

A::A(int x){}
class B :public A{public : B(int ,int);};

B::B(int x,int y):A(x){}

运算符重载:

class A

{

public : A();

A& operator ++();

A& operator ++(int);

//friend A& operator ++(A& x);

//friend A& operator ++(A& x,int);

}

模板

template <typename T ,int x>

class A{public : A();}

模板互相引用

#include <typeinfo>  
#include <stdio.h>
template<typename T0, typename T1, template<typename...> class X>  
class C2;  
template<typename T0, template<typename> class X>  
class C1 : X < T0 >  
{  
    public:  
    C1(){}  
    void CheckArg()  
    {  
        printf("C1 T0:%s X:%s\n", typeid(T0).name(), typeid(X).name());  
    }  
    template<typename T1, template<typename...> class Y>  
    C2<T0,T1,Y> MakeC2();  
};  
template<typename T0, typename T1, template<typename...> class X>  
class C2 : X<T0, T1>  
{  
    public:  
        C2() {}  
        void CheckArg()  
        {  
            printf("C2 T0:%s T1:%s X:%s\n", typeid(T0).name(), typeid(T1).name(), typeid(X).name());  
        }  
        template<template<typename> class Y>  
        C1<T0, Y> MakeC1()  
        {  
            return C1<T0, Y>();  
        }  
};  
template<typename T0, template<typename> class X>  
template<typename T1, template<typename...> class Y>  
C2<T0, T1, Y> C1<T0, X>::MakeC2()  
{  
    return C2<T0, T1, Y>();  
}  
template<typename T>  
class A {};  
template<typename T1, typename T2>  
class B {};  
int main()  
{  
    C1<int, A> c1;  
    C2<int, int, B> c2;  
    C1<int, A> c3 = c2.MakeC1<A>();  
    C2<int, int, B> c4 = c1.MakeC2<int, B>();  
    c3.CheckArg();  
    c4.CheckArg();  
}

四种强制转换

static_cast:可以实现C++中内置基本数据类型之间的相互转换

const_cast: const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉

reinterpret_cast: 有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。

 

dynamic_cast: 

(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。

(2)不能用于内置的基本数据类型的强制转换。

(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

        B中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。

        这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,

        只有定义了虚函数的类才有虚函数表。

(5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的 效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比               static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的 指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。

posted on 2016-08-08 19:29  洛翼mwk  阅读(110)  评论(0编辑  收藏  举报