Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implicit cast of class derived from template base class

I've got a problem with implicit casting, templates and inheritance from template classes. The following is what I extracted from my project, I have left out that some classes are even abstract, but it does not have to do with the case.

class A {};
class B : public A {};

template <typename T> class Base {};
class Derived : public Base<B> {};

int main() {
    Derived d;
    Base<A>* base = new Derived();
}

Basically, I have a template base class Base that I derive Derived : public Base<B> from. Then I have to cast it to the most general occuring form of Base, which is Base<A>.

I would have thought that I can cast an Object deriving from Base<B> to Base<A> implicitly, as B derives from A. Am I doing something wrong or how could I cast that implicitly? This is important as I need to accept all types of Derived classes in a method of Base as a parameter.

Thanks in advance.

like image 222
opatut Avatar asked Jun 04 '11 18:06

opatut


2 Answers

This is not possible. Base<A> has no relation to Base<B>, regardless of the relation between A and B.

like image 139
Puppy Avatar answered Nov 18 '22 01:11

Puppy


Base<B> does not necessarily need to have a relation to Base<A>. This doesn't have anything to do with Derived. If you want to force such a relation, you're going to need a templated constructor.

template <typename T>
class Base
{
    template <typename TOther>
    Base(const TOther& that)
    {
        // ...
    }
    // ...
};

Obviously, the implementation would have to depend on the actual implementation of Base. Note that this constructor doesn't substitute for the normal copy constructor.

like image 39
John Calsbeek Avatar answered Nov 18 '22 00:11

John Calsbeek