首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++期末考试学习材料

C++期末考试学习材料
EN

Stack Overflow用户
提问于 2013-06-10 03:59:45
回答 4查看 928关注 0票数 0

我一直在做这个问题,为即将到来的C++期末考试做准备:

代码语言:javascript
复制
// What gets printed?
#include <iostream>
using namespace std;
class A {
  public:
    A(int a = 5) : i(a) { cout << "A" << endl; }
    void foo() { cout << "this.i " << i << endl; }
    virtual void print() const { cout << i << " in A" << endl; }
  protected:
    int i;
};
class B : public A {
  public:
    B() : A(1) { cout << "B default" << endl; }
    void foo() { cout << i << " in B" << endl; }
    void print() const { cout << i << " in B" << endl; }
};
int main() {
  A *pa;
  B b;
  pa=&b;
  pa->foo();
  pa->print();
  return 0;
}

它的输出是:

代码语言:javascript
复制
A
B default
this.i 1
1 in B

我知道打印的A是从超类A调用B的构造函数,我知道让指针*pa指向&b会使它访问foo的基类方法,但是它是如何在B::print()而不是A::print()中打印值的呢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-10 04:11:36

这是因为,您在B中重写了print(),并且由于foo()在类A中没有定义为virtual,因此调用了类A中的foo()。

票数 2
EN

Stack Overflow用户

发布于 2013-06-10 04:03:32

因为B是从A派生的,所以每个B都是一个A。因此,pa可以指向A类型或任何派生类型的对象。但是对象的类型没有改变,所以b仍然是B类型,并且行为也是这样的。唯一的限制是,因为它被指向A的指针引用,所以只能引用在基类A中声明的方法和成员变量。

有关C++为什么以这种方式工作的解释,请查看vtables上的讨论。

票数 1
EN

Stack Overflow用户

发布于 2013-06-10 04:17:16

代码语言:javascript
复制
virtual void print()

函数前面的单词virtual使得多态性发挥了它的魔力。当派生类实现在基类中声明为virtual的函数时,对于派生类的实例,将调用该函数而不是基类函数。

您创建了一个派生类B的实例,B有一个名为print()的成员函数,它将在那里被调用。

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

https://stackoverflow.com/questions/17013624

复制
相关文章

相似问题

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