论坛上网友题的问题: // 原帖如下 地址:http://www.programfan.com/club/showbbs.asp?id=229171class MyError{private: const char* const m_msg;public: MyError(const char* const msg) : m_msg(msg) { } virtual void Report(void) const { cout << m_msg << endl; }};class MySubError : public MyError{public: MySubError(const char* const msg) : MyError(msg) { } void Report(void) const { cout << "错误原因:" << m_msg << endl; }};提示在红色的行,说是没法访问基类中的私有成员m_msg。但是,这里的这个m_msg不应该是MySubError继承于MyError的成员吗?怎么又成了MyError的成员了?我的第一次回复:LZ可能纳闷为什么继承了却无法访问,是不是没有继承?#include <iostream>using namespace std;class base{ int a;public: virtual void test(){ cout<<"base"<<endl; }};class derived:public base{public: virtual void test(){ cout<<"derived"<<endl; }};int main(){ base t; derived d; cout<<"size base:"<<sizeof t<<endl; cout<<"size derived:"<<sizeof d<<endl; return 0;}输出:size base:8size derived:8请按任意键继续. . .上面的程序说明了的确派生类继承了基类的私有变量,这个变量在内存了确实存在LZ清楚这点就行了,存在却无法访问,我也觉得这不合理,不过就是这样定义的也许就是为了支持封装。但这样的设计就我觉得很不合理,分配一片无法访问的内存给对象,这有什么意义 ? 我的第二次回复:(略)首先纠正红色部分,类并没有数据,类是一种抽象,只有类被实例化时才存在数据,对象的数据成员应该由成员函数去访问,这很好,但是数据成员不管他是私有公有,它都是类的一部分,是具体对象的一个特征,继承父类的私有成员但却无法访问,这同车子里有一个螺蛳却没有任何一把扳手扳得动它,那这个螺蛳有存在的必要吗,它同它周围的死铁又有什么区别?这样的继承体系真是莫名其妙对象有那个特征,但它的成员函数无法访问,我当初学也是不理解,现在还是不理解。现在的观点:情况一:继承类没有重载基类的相关函数,可以直接调用,代码如下#include <iostream>using namespace std;class base{ int i;public: base():i(0){} void set(int k){ i = k; } void print(){ cout<<i<<endl; }};class derived:public base{};int main(){ derived b; b.set(12); // 直接调用 b.print(); return 0;}情况二:继承类重载了相关函数解决 1:在继承类函数中先调用基类函数,代码如下#include <iostream>using namespace std;class base{ int i;public: base():i(0){} void set(int k){ i = k; } void print(){ cout<<i<<endl; }};class derived:public base{public: void set(int j){ base::set(j); // do other } void print(){ base::print(); // do other }};int main(){ derived b; b.set(12); b.print(); return 0;}解决2:通过强制类型转换(这个方法不怎么好)#include <iostream>using namespace std;class base{ int i;public: base():i(0){} void set(int k){ i = k; } void print(){ cout<<i<<endl; }};class derived:public base{public: void print(){ cout<<"derived"<<endl; }};int main(){ derived b,*pd; base *pb; pd = &b; pb = dynamic_cast<base*>(pd); pb->set (22); pb->print(); b.print(); return 0;}

评论