而我的代码是印发错误的,为什么?
///////////////// .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
이 액세스 지정자만public
의 목적은 무엇인가요? 그리고protected
그렇지 않았더라면 좋았을 텐데.상위 클래스의 기능을 오버로드하려면 다음 두 줄을 수정하면 됩니다.
으아아아기본 클래스가 그다지 복잡하지 않은 경우에도 이를 수행할 수 있는 방법이 있습니다.
기본 클래스와 거의 동일한 구조나 클래스를 선언합니다. 클래스인 경우 모든 권한을 공개로 선언한 다음 원래 개체 포인터를 선언한 새 클래스에 캐스팅합니다.
새 구조는 다음 사항을 구현합니다.
1. 원래 기본 클래스에서 액세스해야 하는 멤버 변수를 처음부터 선언해야 합니다. 예를 들어 원래 기본 클래스에는 5개의 변수가 있고 액세스해야 하는 세 번째 변수는 구조의 처음 3개 변수입니다. 원래 기본 클래스에 다른 기본 클래스가 있는 경우 구조도 해당 변수에서 파생됩니다. it
3. 기본 클래스에 가상 함수가 있는 경우 구조체에 virtual이 포함된 소멸자를 추가합니다.
4. 정렬은 기본 클래스와 동일해야 합니다
이 방법을 따르면 기본적으로 모든 작업이 완료됩니다
캡슐화를 훼손하는 말을 하지 마십시오. 기본 클래스의 디자이너