c++ 公有继承中,私有成员只能通过基类接口访问,如果我把派生类强制转换为基类,是否能访问其基类私有成员
ringa_lee
ringa_lee 2017-04-17 15:36:02
0
2
817

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

///////////////// .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_lee
ringa_lee

ringa_lee

全員に返信(2)
PHPzhong

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

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

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

リーリー
いいねを押す +0
黄舟

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート