#include <iostream>
using namespace std;
class A {
public:
virtual void foo() {
cout << "A's foo()" << endl;
bar();
}
virtual void bar() {
cout << "A's bar()" << endl;
}
};
class B: public A {
public:
void foo() {
cout << "B's foo()" << endl;
A::foo();
}
void bar() {
cout << "B's bar()" << endl;
}
};
int main() {
B bobj;
A *aptr = &bobj;
aptr->foo();
A aobj = *aptr;
aobj.foo();
}
输出结果
B's foo()
A's foo()
B's bar()
A's foo()
A's bar()
解释
B bobj;
A *aptr = &bobj;
aptr->foo();
//aptr是一个指向B类的对象bobj的指针
//aptr->foo()将bobj的地址传给this指针
//先调用bobj中的foo输出B's foo()
//其中又调用了A::foo输出A's foo()
//此时又调用了一个bar();也就是this->bar();也就是B类对象bobj的bar()函数输出B's bar
A aobj = *aptr;
//*aptr是个B类的对象bobj
//A aobj = *aptr;将子类对象复制给基类对象,发生切割,就是只复制了两类中相同成员部分,
aobj.foo();