c++ - 在没有虚拟原型(prototype)的情况下调用继承类的一种方法

标签 c++ inheritance boost

我有一些基础class A ,以及一些继承的类:

class B : public A
class C : public A
class D : public A

我有解析一些配置文件的功能,它在配置调用中使用名称:

void do_smth<B>(...);
void do_smth<C>(...);
void do_smth<D>(...);

我有map<A*> objs;在这些函数中发生了:

void do_smth<T>(...)
{
  T *control = new T();
  ...
  objs[name] = T;
}

所以我有指向 A 的指针映射。在其他函数中我得到 name ,我需要获取存储在 B、C 或 D 类中的值。 问题是我无法将虚函数添加到任何将返回这些值的类,因为库中的 A、B、C、D 和 B 具有函数 value()、C - text()、D - currentValue() 等.我需要功能get_value()这将返回 value(), text(), currentValue() 的结果取决于类(class)? 你能建议我什么来解决我的问题?

我看到两种方法:

1) 我可以从指向类 B、C、D 的指针编写函数并调用类似的函数 get_value((B*)objs[name]);但我觉得这样不好。

2)我可以创建boost::bind具有我需要的函数的对象,用于创建 B、C、D 变量。

什么方法会更好,或者你能给我更好的建议吗?

最佳答案

所以你有

A* a;

并且不知道它是什么类型。尝试dynamic_cast:

B* b = dynamic_cast<B*>(a);
if ( b ) 
    return b->value();
//C and D the same way

关于c++ - 在没有虚拟原型(prototype)的情况下调用继承类的一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6926922/

相关文章:

C++访问结构变量导致段错误

c++ - 如何在 XCode 3.2.3 上启用异常处理?

c++ - 为什么重命名我的变量可以防止段错误?

java - 使用 super 关键字从不同包调用基类的 protected 构造函数

c++ - boost::asio readsome 函数似乎不起作用

c++ - 过程程序和面向对象的程序有什么区别?

python - 什么是 "inheritable alternative constructors"?

java - 在 Java 中,如何从重写类的实例调用重写类的方法

c++ - 使用来自 boost::multiprecision 的 cpp_bin_float float 学运算出错

c++ - 如何从 boost::multi_index_container 中检索元素