c++ 公有继承中,私有成员只能通过基类接口访问,如果我把派生类强制转换为基类,是否能访问其基类私有成员
本文介绍了c++ 公有继承中,私有成员只能通过基类接口访问,如果我把派生类强制转换为基类,是否能访问其基类私有成员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
而我的代码是印发错误的,为什么?
///////////////// .h
#ifndef HI_H_INCLUDED
#define HI_H_INCLUDED
#include <iostream>
using namespace std;
class Worker
{
string name;
public:
Worker(string na):name(na){}
private:
void data()
{
cout<<"worker"<<endl;
}
};
class Waiter:virtual public Worker
{
public:
Waiter(string na1):Worker(na1){}
void show()
{
((Worker &)*this).data(); ///强制转化为基类,为什么还是不能调用私有函数data()
data();
}
private:
void data()
{
cout<<"waiter"<<endl;
}
};
#endif // HI_H_INCLUDED
//////////// .cpp
#include <iostream>
#include "hi.h"
#include<stdlib.h>
using namespace std;
int main()
{
Worker a("lin");
Waiter b("liu");
b.show();
system("pause");
}
解决方案
这样当然是不行的。
把一个成员声明为私有的目的就是不让你在子类中用,要是像题主这样强制类型转换之后就可以用的话还要private
这个访问说明符干嘛,只留public
和protected
不就好了。
如果你想重载(overload)父类的函数,可以修改两行:
class Worker
{
string name;
public:
Worker(string na):name(na){}
//private:
protected: // <-- 1
void data()
{
cout<<"worker"<<endl;
}
};
class Waiter:virtual public Worker
{
public:
Waiter(string na1):Worker(na1){}
void show()
{
//((Worker &)*this).data(); ///强制转化为基类,为什么还是不能调用私有函数data()
Worker::data(); // <-- 2 调用父类的同名方法
data(); // <-- 3 此处会调用子类的方法
}
private:
void data()
{
cout<<"waiter"<<endl;
}
};
这篇关于c++ 公有继承中,私有成员只能通过基类接口访问,如果我把派生类强制转换为基类,是否能访问其基类私有成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文