代码之家  ›  专栏  ›  技术社区  ›  dia

c++中的问题(多形性,基于范围的for循环)

c++
  •  -2
  • dia  · 技术社区  · 8 年前

    请理解,我才刚刚开始学习C++。我肯定缺少一些基本的了解,因为我无法配置:

    1. 当我用void f()替换类A中的虚void f()时,为什么下面的代码会更改其输出?(无效时打印B,虚拟无效时打印C)

      class A{
      public:
          virtual void f(){ 
          cout<<"A";}
          };
      
      class B:public A{
      public:
          void f(){
          cout<<"B";}
          };
      class C:public B{
      public:
          void f(){cout<<"C";}
          };
      int main(){
          B *p = new C;
          p->f();
          }
      
    2. 为什么下面的代码打印的不仅仅是“CPP!”?

      int main (){
           int x[10] = {1,2,3,4,5,6,7,8,9,10};
      for(int y:x){
      switch(y){
          case 1:cout<<"C";
          case 3:cout<<"P";
          case 7:cout<<"P";
          case 8:cout<<"!";
      }
      

      }

    我期待着收到各位专家的回复。。

    1 回复  |  直到 8 年前
        1
  •  1
  •   BobMorane    8 年前

    当我用void f()替换类A中的虚void f()时,为什么下面的代码会更改其输出?(无效时打印B,虚拟无效时打印C)

    当一个类从另一个类继承时(例如在您的情况下 B C 从…起 A B 分别) virtual 关键字表示其应用于的方法( f() )在您的情况下),可以为子类重新定义。在您的情况下,它允许类 B C 拥有自己的个人实现 f() ,通过多态性。注意你的 main() 您创建了一个 C 对象,而不是 B :

    B *p = new C;
    

    这似乎令人困惑,因为它的地址 C 对象存储在 B 指针,但在C++中是合法的,因为 C 对象实际上是 B 对象,因为它继承(具有“is a”关系) B . 当你打电话的时候 f() 在那上面 B 指针存储 C 对象,启用多态性,因为该方法是 事实上的 :它选择 C -版本 f() 方法,这就是为什么您会看到 C 印刷的。

    当您删除 事实上的 多态性被禁用 C 对象被视为 B 对象,以及 B -版本 f() 已选中。然后你看“ B “在您的屏幕上。

    为什么下面的代码打印的不仅仅是“CPP!”?

    从…起 this ,它说:

    switch语句继承了 早期的C编译器,因为它使用标签 块的数量。在最典型的使用中(如上所示),这意味着 在一个 案件(包括任何其他标签下的案件)也被执行, 直到开关块或跳转语句结束(如break) 已达到。

    那么,试试这个:

    int main ()
    {
        int x[10] = {1,2,3,4,5,6,7,8,9,10};
        for(int y:x)
        {
            switch(y)
            {
                case 1:cout<<"C";break; // <- notice the 'break'!
                case 3:cout<<"P";break;
                case 7:cout<<"P";break;
                case 8:cout<<"!";break;
            }
        }
    }