C++ 将变量作为基类对象进行迭代,同时强制转换到子类,并在C++;

C++ 将变量作为基类对象进行迭代,同时强制转换到子类,并在C++;,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,我正在尝试做一些我觉得应该更直接的事情,或者我的Java知识会干扰我,但我无法理解 我只想做一个向量{aa,bb,cc},其中bb和cc是基类a的子实例。每个子类使用相同的函数名,但有不同的实现。所以我想做的是在迭代过程中调用该实现 这是我的尝试 #include <iostream> #include <vector> class A { public: virtual ~A() = default; }; class B: public A {

我正在尝试做一些我觉得应该更直接的事情,或者我的Java知识会干扰我,但我无法理解

我只想做一个
向量{aa,bb,cc}
,其中
bb
cc
是基类
a
的子实例。每个子类使用相同的函数名,但有不同的实现。所以我想做的是在迭代过程中调用该实现

这是我的尝试

#include <iostream>
#include <vector>

class A {
  public: 
    virtual ~A() = default;
};

class B: public A {
  public:
    int h() {
      return 2;
    }
};

class C: public A {
  public:
    int h() {
      return 3;
    }
};

int main() {
  std::cout << "hello world" << std::endl;
  
  // Inheritance
  A aa;
  B bb;
  C cc;

  std::vector<A> as {aa, bb, cc};

  for (A child: as) {
    if (typeid(B) == typeid(child)) {
      std::cout << "child is a B" << std::endl;
      B* child_b_p= static_cast<B*>(&child);
      std::cout << child_b_p -> h() << std::endl;
    }
    
    if (typeid(C) == typeid(child)) {
      std::cout << "child is a C" << std::endl;
      C* child_c_p= static_cast<C*>(&child);
      std::cout << child_c_p -> h() << std::endl;
    }
  }

  return 0;
}
我只看到
你好世界
。在这种情况下,对象切片的可能解决方法是什么?

您正遭受着这样的痛苦。多态性仅在使用指向对象的指针/引用时有效,而您不是

此外,该代码:

if(typeid(B)=typeid(child)){
...
B*child\u B\u p=静态演员阵容(&child);
...
}
应编写为使用
dynamic\u cast
而不是
typeid()

请尝试以下方法:

#包括
#包括
甲级{
公众:
virtual~A()=默认值;
};
B类:公共A{
公众:
int h(){
返回2;
}
};
C类:公共A类{
公众:
int h(){
返回3;
}
};
int main(){
标准::cout
child is a B
2
child is a C
3