【问题标题】:questions in c++ (polymerphism, range-based for loop)C++ 中的问题(多态性,基于范围的 for 循环)
【发布时间】:2018-05-11 19:46:24
【问题描述】:

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

  1. 为什么当我将 A 类中的 virtual void f() 替换为 void f() 时,以下代码会更改其输出? (它在 void 时打印 B,在 virtual void 时打印 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<<"!";
    }
    

    }

期待各位专家的回音。

【问题讨论】:

标签: c++


【解决方案1】:

为什么当我将 A 类中的 virtual void f() 替换为 void f() 时,以下代码会更改其输出? (它在 void 时打印 B,在 virtual void 时打印 C)

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

B *p = new C;

这似乎令人困惑,因为 C 对象的地址存储在 B 指针中,但在 C++ 中是合法的,因为 C 对象实际上是 B 对象,因为它继承(具有“是”关系)来自B。当您在存储B 对象的B 指针上调用f() 时,将启用多态性,因为该方法是virtual:它选择C 版本的f() 方法,这就是为什么您查看打印的C

当您删除virtual 多态性被禁用时,C 对象被视为B 对象,并且B 版本的f() 被选中。然后您会在屏幕上看到“B”。

为什么下面的代码打印的多于“CPP!”?

来自this,它说:

switch 语句有一种从 第一个 C 编译器的早期,因为它使用标签代替 块。在最典型的使用中(如上所示),这意味着 在每组语句之后需要 break 语句 特定的标签。如果不包括 break,则后面的所有语句 该案件(包括任何其他标签下的案件)也被执行, 直到 switch 块或跳转语句(如 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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多