首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚函数输出?

虚函数输出?
EN

Stack Overflow用户
提问于 2012-02-17 00:48:47
回答 3查看 103关注 0票数 0

我只是在做一些事情,然后写了这个程序。我得到了以下输出。我知道函数解析发生在运行时,而变量绑定发生在编译时,但我不能理解的是我得到的第一个输出(this->n)。有人能给我解释一下吗?

代码语言:javascript
复制
    # include <iostream>
    # include <stdio.h>
    # include <conio.h>

    using namespace std;

    class A
    {
      int n;      
      public:
      virtual void Fun1(int no=10)
       {
         int n=no;        
         cout<<"A::Fun1() "<<n <<"\n";
       }
    };

    class B :public A
    {
     int n;      
     public:
     virtual void Fun1(int no=20)
     {
      int n=no;        
      cout<<"B::Fun1() " << this->n << "\n"; // WHY SO ? gives B::Fun1() 40
      cout<<"B::Fun1() " << n << "\n";
     }
    };

    int main()
    {
     B b;
     A &a =b;
     a.Fun1();
     A a1=b;
     a1.Fun1();
     getch();
     return 0;
    }

我得到的输出是

代码语言:javascript
复制
    B::Fun1() 40
    B::Fun1() 10
    A::Fun1() 10    
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-17 00:54:05

对于第一个输出,this->n引用了成员变量B::n,您从未对其进行初始化-这可能会打印任何内容。

对于第二个,n引用局部变量n,您可以使用函数参数对其进行初始化。由于默认参数是由调用者提供的,并且您是通过对A的引用来调用函数的,因此您将获得在A::Fun1中指定的默认值,而不是在B::Fun1中指定的默认值。如果您调用b.Fun1(),那么它将打印B::Fun1() 20

对于第三个,您对B对象进行了“分片”,给出了一个A类型的对象,因此调用了A::Fun1

票数 5
EN

Stack Overflow用户

发布于 2012-02-17 00:54:30

您的成员变量B::n未在任何地方初始化。你很幸运,你得到了一个合理的值,它可以是任何东西。

票数 3
EN

Stack Overflow用户

发布于 2012-02-17 00:59:24

你的B::n是未初始化的,当我运行代码时会得到这个错误。

B::Fun1() -858993460 B::Fun1() 10 A::Fun1() 10

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9315361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档