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