而我的代码是印发错误的,为什么?
///////////////// .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
不就好了。
如果你想重载(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; }};