正文

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

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

分享到:

论坛上网友题的问题:

// 原帖如下 地址:http://www.programfan.com/club/showbbs.asp?id=229171
class 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:8
size 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;
}

阅读(2730) | 评论(0)


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

评论

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