検索

ホームページ  >  に質問  >  本文

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");
}
ringa_leeringa_lee2809日前820

全員に返信(2)返信します

  • PHPz

    PHPz2017-04-17 15:38:02

    もちろん、そんなことは不可能です。

    メンバーをプライベートとして宣言する目的は、サブクラスで使用できないようにすることです。privateこのアクセス指定子は public のみに使用されます。とprotectedそうでなかったらいいのに。

    親クラスの関数をオーバーロードしたい場合は、次の 2 行を変更できます:

    リーリー

    返事
    0
  • 黄舟

    黄舟2017-04-17 15:38:02

    基底クラスがそれほど複雑でない場合でも、それを行う方法はあります。
    基本クラスとほぼ同じ構造体またはクラスを宣言します。それがクラスの場合は、すべての権限を public として宣言し、宣言した新しいクラスに元のオブジェクト ポインターをキャストします。
    新しい構造は次の点を実装します。
    1. 元の基本クラスで最初からアクセスする必要があるメンバー変数を宣言する必要があります。たとえば、元の基本クラスには 5 つの変数があり、3 番目にアクセスする必要があるのは、構造体の最初の 3 つの変数です。元の基本クラスに他の基本クラスがある場合、構造体もそれらから派生します。 it
    3. 基本クラスに仮想関数がある場合は、仮想を持つデストラクターを構造体に追加します。
    4. アラインメントは基本クラスと同じである必要があります
    このメソッドに従えば、基本的にすべてが完了します
    カプセル化を損なうようなことは何も言わないでください。元の欠点は、による思慮深い考慮の欠如にあります。基本クラスのデザイナー

    返事
    0
  • キャンセル返事