首页 > 开发 > C++ > 正文

c++ 公有继承中,私有成员只能通过基类接口访问,如果我把派生类强制转换为基类,是否能访问其基类私有成员

2017-09-11 21:23:11  来源: 网友分享

而我的代码是印发错误的,为什么?

///////////////// .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这个访问说明符干嘛,只留publicprotected不就好了。

如果你想重载(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;    }};