我一直在做这个问题,为即将到来的C++期末考试做准备:
// 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;
}它的输出是:
A
B default
this.i 1
1 in B我知道打印的A是从超类A调用B的构造函数,我知道让指针*pa指向&b会使它访问foo的基类方法,但是它是如何在B::print()而不是A::print()中打印值的呢
发布于 2013-06-10 04:11:36
这是因为,您在B中重写了print(),并且由于foo()在类A中没有定义为virtual,因此调用了类A中的foo()。
发布于 2013-06-10 04:03:32
因为B是从A派生的,所以每个B都是一个A。因此,pa可以指向A类型或任何派生类型的对象。但是对象的类型没有改变,所以b仍然是B类型,并且行为也是这样的。唯一的限制是,因为它被指向A的指针引用,所以只能引用在基类A中声明的方法和成员变量。
有关C++为什么以这种方式工作的解释,请查看vtables上的讨论。
发布于 2013-06-10 04:17:16
virtual void print()函数前面的单词virtual使得多态性发挥了它的魔力。当派生类实现在基类中声明为virtual的函数时,对于派生类的实例,将调用该函数而不是基类函数。
您创建了一个派生类B的实例,B有一个名为print()的成员函数,它将在那里被调用。
https://stackoverflow.com/questions/17013624
复制相似问题