I have the following code:
#include <iostream>
#include "boost/shared_ptr.hpp"
using boost::shared_ptr;
class Base {
public:
virtual ~Base() {}
virtual void print() = 0;
};
template <typename T>
class Child : public Base {
public:
virtual void print() {
std::cout << "in Child" << std::endl;
}
};
class GrandChild : public Child<int> {
public:
virtual void print() {
std::cout << "in GrandChild" << std::endl;
}
};
template <typename T>
void call_print(shared_ptr<Child<T> > a) {
a->print();
}
void call_base_print(shared_ptr<Base> a) {
a->print();
}
int main() {
shared_ptr<GrandChild> gchild(new GrandChild);
call_print(shared_ptr<Child<int> >(gchild));
// call_print(gchild); // Cannot compile!
call_base_print(gchild); // This works.
return 0;
}
我发现很奇怪,
call_base_print(gchild)
可以正常工作,但call_print(gchild)
会导致编译错误。我知道C ++不允许两个隐式转换,但我不认为这里有两个转换... 有人能解释一下吗?