而我的代码是印发错误的,为什么?
///////////////// .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");
}
PHPz2017-04-17 15:38:02
もちろん、そんなことは不可能です。
メンバーをプライベートとして宣言する目的は、サブクラスで使用できないようにすることです。private
このアクセス指定子は public
のみに使用されます。とprotected
そうでなかったらいいのに。
親クラスの関数をオーバーロードしたい場合は、次の 2 行を変更できます:
リーリー黄舟2017-04-17 15:38:02
基底クラスがそれほど複雑でない場合でも、それを行う方法はあります。
基本クラスとほぼ同じ構造体またはクラスを宣言します。それがクラスの場合は、すべての権限を public として宣言し、宣言した新しいクラスに元のオブジェクト ポインターをキャストします。
新しい構造は次の点を実装します。
1. 元の基本クラスで最初からアクセスする必要があるメンバー変数を宣言する必要があります。たとえば、元の基本クラスには 5 つの変数があり、3 番目にアクセスする必要があるのは、構造体の最初の 3 つの変数です。元の基本クラスに他の基本クラスがある場合、構造体もそれらから派生します。 it
3. 基本クラスに仮想関数がある場合は、仮想を持つデストラクターを構造体に追加します。
4. アラインメントは基本クラスと同じである必要があります
このメソッドに従えば、基本的にすべてが完了します
カプセル化を損なうようなことは何も言わないでください。元の欠点は、による思慮深い考慮の欠如にあります。基本クラスのデザイナー