读书人

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

发布时间: 2012-04-08 14:38:30 作者: rapoo

什么是共变、逆变
#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等等等等。

读书人网 >C++

热点推荐