在C ++中从派生到模板化​​基础的向上转换

时间:2012-03-26 09:54:26

标签: c++ casting

编辑:

我意识到这段代码可以编译并运行:

#include <iostream>

template<class Something> class Base {
public:
    Base() {

    }

    virtual ~Base() {
    }

    virtual void method() = 0;
};

class Derived: public Base<std::string> {
public:
    Derived() {

    }

    virtual ~Derived() {

    }

    void method() {
    }
};

template<class Something> class TemplatedClass {
public:
    void method(Base<Something>* base) {
    }
};

class SomeClass: public TemplatedClass<std::string> {
};

int main(int argc, char **argv) {

    Derived* d = new Derived();

    Base<std::string>* b = d;
    Base<std::string>* b1 = dynamic_cast<Base<std::string>*>(d);
    Base<std::string>* b2 = static_cast<Base<std::string>*>(d);

    SomeClass sc;
    sc.method(b);
    sc.method(b1);
    sc.method(b2);
}

然后,我在准备骨架或甚至试图理解我自己的代码时犯了一个非常大的错误。多可惜!!!对不起......这是一个非常糟糕的问题。删除它会更好......

**下面没有任何感官问题和代码** 鉴于此:

template<class Something> class Base
{
    virtual void method() = 0;
};

class Derived: public Base<std::string>
{
    void method() { ... };
};

我想将Derived的指针向下转换为指针Base。我试图使用dynamic_cast但没有成功:

...
Derived* d = new Derived();
Base* b = dynamic_cast<Base*>(d);
...

执行期间我总是遇到错误。

我不知道我是否需要向下转发。我有这种情况:

template<class Something> class TemplatedClass
{
    void method(Base<Something>* base) { ... };
};

class SomeClass : public TemplatedClass<std::string> { ... };

我想打电话给(EDITED *):

Derived* d = new Derived();

SomeClass sc;
sc.method(d);

但它给了我转换错误。

我需要什么?向下倾斜还是什么?

1 个答案:

答案 0 :(得分:2)

据推测,你的测试看起来真的像这样吗?

Base<std::string>* b = dynamic_cast<Base<std::string> *>(d); 

即。它必须是实例化模板的强制转换,而不是没有类型参数的Base

等一下 - 你做的是派生到基地!

Base<std::string>* b = d; 

那应该没事!

你的第二个例子看起来并不正确 - 特别是:

SomeClass sc();

应该是:

SomeClass sc;

您可以发布真实的代码和确切的错误消息吗?