Неявное приведение класса, полученное из базового класса шаблона - PullRequest
5 голосов
/ 04 июня 2011

У меня проблема с неявным приведением, шаблонами и наследованием из шаблонных классов. Далее я извлек из своего проекта то, что некоторые классы даже абстрактны, но это не имеет отношения к случаю.

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();
}

По сути, у меня есть базовый класс шаблона Base, из которого я получаю Derived : public Base<B>. Затем я должен привести его к наиболее распространенной форме Базы, которая является Base<A>.

Я бы подумал, что могу разыграть Объект, производный от Base<B> до Base<A> неявно, поскольку B происходит от A. Я делаю что-то не так или как я могу разыграть это неявно ? Это важно, так как мне нужно принимать все типы производных классов в методе Base в качестве параметра .

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 04 июня 2011

Это невозможно. Base<A> имеет нет отношения к Base<B>, независимо от отношения между A и B.

2 голосов
/ 04 июня 2011

Base<B> не обязательно должно иметь отношение к Base<A>. Это не имеет ничего общего с Derived. Если вы хотите форсировать такое отношение, вам понадобится шаблонный конструктор.

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

Очевидно, что реализация должна зависеть от фактической реализации Base. Обратите внимание, что этот конструктор не заменяет обычный конструктор копирования.

...