在C++中从衍生碱基向模板碱基上转换

upcasting from derived to templated base in C++

本文关键字:转换 C++      更新时间:2023-10-16

编辑:

我意识到这段代码可以编译并工作:

#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> { ... };

我想打电话给(编辑*):

Derived* d = new Derived();
SomeClass sc;
sc.method(d);

但它给了我一个转换错误。

我需要什么?下行还是什么?

假设您的测试实际上是这样的?

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

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

等一下——你正在做的是从基础派生!

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

那应该没问题!

你的第二个例子看起来不对——特别是:

SomeClass sc();

应该是:

SomeClass sc;

你能公布真实的代码和确切的错误信息吗?