正文

继承问题(论坛)2007-04-30 22:23:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/25380.html

分享到:

论坛上网友题的问题: // 原帖如下 地址: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;}

阅读(2875) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册