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

 花落---守护者 发布于 2022-10-31 10:38

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

///////////////// .h
#ifndef HI_H_INCLUDED
#define HI_H_INCLUDED
#include 
using namespace std;
class Worker
{
    string name;

public:
    Worker(string na):name(na){}
private:    
    void data()
    {
        cout<<"worker"<
#include "hi.h"
#include

using namespace std;


int main()
{
    Worker a("lin");
    Waiter b("liu");

    b.show();
    system("pause");
}
2 个回答
  • 如果基类不是很复杂的话,还是有办法搞定的。
    声明一个与基类几乎一样的结构体或类,如果是类的话,把所有的权限都声明成public的,然后将原对象指针强制转型成你声明的新类就成了。
    新的结构体实现以下几点:
    1.需要声明原基类中从第一个到你需要访问的成员变量。比如原基类中有5个变量,你需要访问的是第3个,那结构体就声明前3个就成
    2.如果原基类有其它基类,那结构体也从它们派生就是了
    3.如果基类中有虚函数,结构体加上一个带virtual的析构函数。
    4.对齐方式要与基类相同
    按照这个方式,基本上就都能搞定了
    不要说什么破坏封装性的话,原罪在基类的设计者考虑不周到

    2022-10-31 22:18 回答
  • 这样当然是不行的。

    把一个成员声明为私有的目的就是不让你在子类中用,要是像题主这样强制类型转换之后就可以用的话还要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;
        }
    };
    2022-10-31 22:18 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有