首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

什么是共变、逆变,该怎么解决

2012-04-08 
什么是共变、逆变#include vector#include utility#include map#include string#include iostream

什么是共变、逆变
#include <vector>
#include <utility>
#include <map>
#include <string>
#include <iostream>
class   A
{
        public:
                virtual   void   print()   =   0;
};
void   f(A   *pa)
{
        pa-> print();
}
class   B:private   A
{
        public:
                virtual   void   print()
                {
                        std::cout   < <   "this   is   B "   < <   std::endl;
                }
                void   init()
                {
                        f(this);//this   -->   A*
                }
                A&   getARef()
                {
                        return   *this;//*this   -->   A&
                }
                A*   getAP()
                {
                        return   this;//this   -->   A*
                }
};
int   main()
{
        std::auto_ptr <B>   apB(new   B);
        apB-> init();
        apB-> getARef().print();
        apB-> getAP()-> print();
        //std::auto_ptr <A> apA(new   B);//error
        return   0;
}

私有继承,却能把this指针转换成基类的指针,疑问?

据说这是应用了共变、逆变的原理。我看过的C++书都没有提到这两个概念,请问各位XDJM,什么叫共变、逆变?可否详细点解释一下。

[解决办法]
std::auto_ptr <A> apA(new B);

------------------------------------

根据auto_ptr的实现(忽略细节),它相当于:

A* a = new B;

这种情况是在B的外部将B的指针转化为A的指针。在B的外部转化是需要public继承的。
在B的内部,对于this指针的转换,则不需要public继承。
归根到底,访问权限虽然在类中定义,但却是针对外部和派生类的限制;对自身,其实不起作用。

说到书,有些书可能不会具体地针对这个问题,但是其原理(继承和访问权限),任何一本C++教材都会讲的。需要的是深入理解、举一反三。
比较好的教材有:C++ Primer, The C++ Programming Language等等等等。

热点排行