class Base
{
    public:
    Base(const char *s=NULL);
    Base(const Base& rth);
    Base & operator=(const Base & oth);
    virtual ~Base();
    private:
    char *m_data;
};
Base::Base(const char* s)
{
    if(s==NULL)
    {
        m_data=new char[1];
        m_data[0]='';
    }
    else
    {
        int length=strlen(s);
        m_data=new char[length+1];
        strcpy(m_data,s);
    }
}
Base::Base(const Base & oth)
{
    int len=strlen(oth.m_data);
    m_data=new char[len+1];
    strcpy(m_data,oth.m_data);
}
Base & Base::operator=(const Base & oth)
{
    if(this==&oth) return *this;
    delete []m_data;
    int len=strlen(oth.m_data);
    m_data=new char[len+1];
    strcpy(m_data,oth.m_data);
    return *this;
}
Base::~Base()
{
    delete[] m_data;
}

class Derived : public Base
{
    public:
    Derived(const char* s=NULL,int a=0);
    Derived(const Derived& oth);
    Derived& operator=(const Derived& oth);
    private:
    int m;
};
Derived::Derived(const char* s,int a):Base(s),m(a){ }
Derived::Derived(const Derived& oth):Base(oth),m(oth.m){ }
Derived& Derived::operator=(const Derived& oth)
{
    if(this==&oth) return *this;
    Base::operator=(oth);
    m=oth.m;
    return *this;
}
 
  C++编译器不支持模板头文件和实现代码分离的编译

  在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找(当遇到未决符号时它会寄希望于连接器)。这种模式在没有模板的情况下运行良好,但遇到模板时不行,因为模板仅在需要的时候才会具现化出来,所以,当编译器只看到模板的声明时,它不能具现化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。然而当实现该模板的.cpp文件中没有用到模板的具现体时,编译器懒得去具现,所以,整个工程的.obj中找不到一行模板具现体的二进制代码,于是连接器也傻了!