c++ - 通过基类指针获取子类类型

标签 c++ templates pointers types

鉴于类布局(Base->Derived;Base->Derived2),以及我将派生类的实例作为基类指针( Base* baseder2 = new Derived2 ),我希望能够实例化具有派生类型的 TemplClass 实例(类似于 sh = new TemplClass<Derived2>(baseder2) )。下面的代码实例化 sh = new TemplClass<Base>(baseder2) ,这会导致编译错误,因为 fn function未在类 Base 中声明。如何找出 baseder2 的派生类型指针,最好没有dynamic_cast?现实生活中的代码有很多 Base 后代,所以我想避免使用dynamic_cast 的 if 语句。我正在研究 boost::type_traits,但说实话,我不知道该怎么办。 模板函数template <typename T> BaseTemplClass* foo(T* t) 只是工厂对象的蹩脚借口。

最诚挚的问候, 多多尔

class Base
{
public:
  virtual ~Base(){}
};

class Derived : public Base
{
public:
  virtual ~Derived(){}
  void function()
  {
    std::cout<<"This is Derived"<<std::endl;
  }
};

class Derived2 : public Base
{
public:
  virtual ~Derived2(){}
   void function()
  {
    std::cout<<"This is Derived2"<<std::endl;
  }
};

class BaseTemplClass
{
public:
  virtual void Print() =0;
};

template <class Tmodel>
class TemplClass : public BaseTemplClass
{
public:
  TemplClass(Tmodel* m)
  {
    model = m;
  }
  void Print()
  {
    model->function();
    std::cout << " TemplClass"<<typeid(model).name() << std::endl;
  }
  Tmodel *model;
};

template <typename T> BaseTemplClass* foo(T* t)
{
  BaseTemplClass* sh;
  std::cout << "FOO: "<<typeid(t).name() << std::endl;
  sh = new TemplClass<T>(t);
  return sh;
}


int main(int argc, char **argv) 
{
    Derived* der = new Derived;
    Derived2* der2 = new Derived2;
    Base* baseder2 = new Derived2;

    BaseTemplClass* sh = foo(der);
    sh->Print();
    delete sh;

    sh = foo(der2);
    sh->Print();
    delete sh;


    sh = foo(baseder2);
    sh->Print();
    delete sh;

    delete der;
    delete der2;
    delete baseder2;
    return 0;
}

最佳答案

Base中使function抽象更有意义,这样您就不需要知道它是哪个派生类,这样会更有意义吗?

关于c++ - 通过基类指针获取子类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5472102/

相关文章:

c++ - 我可以在不调用未定义行为的情况下存储指向不存在数据的指针吗?

objective-c - 每次将对象添加到队列或堆栈时是否都需要创建对象的新实例? Objective-C

c++ - Controller 和 View 之间的耦合

c++ - 通过与多个 3D 平面相交获得最小二乘调整的单线

如果参数之一是字符串,则 C++ 返回类型等于字符串

c++ - 通过参数推导多参数模板中的第一个模板参数

css - 在 sonata admin 中水平对齐标签和输入

c++ - 如何在 C 中为二维数组动态分配内存以避免堆栈溢出问题?

c - 使用 char ** 指针的字符串操作代码给出了意外的结果

c++ - Visual Studio 上带有容器迭代器的别名模板