[Basic C++] Base Class Pointer access Derived class member

你是否有遇过这样的情况:

class Base {public:    Base(int a) : A(a) {}    virtual ~Base(){}        // print function in Base class    void printA(){ std::cout << A << endl; }private:    int A;};class Derived : public Base {public:    Derived(int a, int b) : Base(a), B(b) {}    virtual ~Derived(){}        // print function in Derived class    void printB(){ std::cout << B << endl; }private:    int B;};int main(){    Base* b0;    int a=0, b=1;    b0 = new Derived(a,b);    b0->printA();    b0->printB();    return 0;}

在执行到 b0->printB();的时候,compiler会出现以下错误:
http://img2.58codes.com/2024/20159955iE9wJbFCwi.png

1. static_cast<>

这种时候就直接使用大招:

static_cast<Derived*>(b0)->printB();

就可以使用了。

!!!注意!!!
Base class pointer无法存取Derived class member是正常的。任意存取Derived class member其实是非常危险的,Base class pointer不应该知道自己new了什么样的derived class。除非你真的知道你在干嘛,否则就请乖乖写virtual function并用override(c++11)方式实作这些功能。

2. virtual function

在 class Base里面加上:

class Base {public:    Base(int a) : A(a) {}    virtual ~Base(){}        // print function in Base class    void printA(){ std::cout << A << endl; }    virtual printB(){}       // virtual function to be override    // virtual printB() = 0; // = 0: pure virtual function, must be override    private:    int A;};

而在 class Derived 里面加上override保险:

class Derived : public Base {public:    Derived(int a, int b) : Base(a), B(b) {}    virtual ~Derived(){}        // print function in Derived class // override    void printB() override { std::cout << B << endl; }private:    int B;};

这样就不会有compile error了。

3. Reference

https://stackoverflow.com/questions/2436125/c-access-derived-class-member-from-base-class-pointer


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章