#include<bits/stdc++.h>
using namespace std;
/**
* 基类指针操作派生类对象时,只能访问虚函数,新增成员无法访问
* */
class B {
int x;
public:
B(int i) {
x = i;
}
int getx() {
return x;
}
virtual void f() {
printf("Base B: x=%d\n", x);
}
};
class D1: public B {
int x;
public:
D1(int i): B(i) {
}
virtual void f() {
printf("D1 :x=%d\n", getx());
}
};
class D2: public B {
int x;
public:
D2(int i): B(i) {
}
virtual void f() {
printf("D2 :x=%d\n", getx());
}
void g() {
printf("this is D2 own\n");
}
};
// void accessB(B *pb) {
// pb->f();
// // pb->g(); // 错误,B 中没有 g ,因此无法访问
// }
void accessB(B *pb) {
D2 *p = dynamic_cast<D2 *> (pb); // 如果可以向下转换,那么调用派生类的函数,否则调用基类函数
if(p) {
p->g();
}
else {
pb->f();
}
}
int main() {
B b(1);
D1 d1(2);
D2 d2(3);
accessB(&b);
accessB(&d1);
accessB(&d2);
return 0;
}