基类指针操作派生类对象时,只能访问虚函数,新增成员无法访问

#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;
}
原文地址:https://www.cnblogs.com/consolexinhun/p/15738408.html