你是否有遇过这样的情况:
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会出现以下错误:
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