关于面向对象中的继承和模板中的继承

来源:互联网 发布:.cn域名能用于商业吗? 编辑:程序博客网 时间:2024/05/22 22:07

一旦我们跨入Template C++的大门,继承就不像以前那般通畅无阻了。如下例:

template<typename T>

class Base

{

public:

       void print()

       {

              cout << "Base" << endl;

       }

};

 

template<typename T>

class Derived: public Base<T>

{

public:

       void print2()

       {

              print();    //调用base class函数,产生编译错误

       }

};

对于一个好的编译器,如果我们尝试在derived class template中调用base class template中的成员函数时,会产生编译错误,因为我们在编译器遇到Derived时,并不知道它继承什么样子的class,更不知道base class中是否存在print()函数。解决方法有:

(1)    base class函数调用动作前加上“this->”:

void print2()

       {

              this->print();    //OK

       }

(2)    使用using声明:

class Derived: public Base<T>

{

public:

    using Base<T>::print();  //告诉编译器,print()位于base class

       void print2()

       {

              print(x);    //调用base class函数,产生编译错误

       }

};

(3)    使用作用域限定符:

void print2()

       {

              Base<T>::print();    //OK

       }

原创粉丝点击