【发布时间】:2017-01-25 08:34:45
【问题描述】:
我有一个基类,比如Employee,上面有一些方法。稍后我将派生一些子类,例如Manager、Developer、Designer 等,它们也是雇员(因为继承)。现在说代码看起来像 -
#include <iostream>
#include <vector>
class Employee{
private : char name[5] = "abcd";
void allDept(){ std::cout<<"Woo"; }
public: void tellName(){std::cout << name << "\n"; }
void showEveryDept(){std::cout<< "Employee can see every dept\n";
allDept(); }
virtual ~Employee() {}
};
class Manager: public Employee{
private : char dept[5] = "aaaa";
public: void showOwnDept(){std::cout<< "Manager can see own dept\n";}
};
class Designer: public Employee{
private : char color = 'r';
public: void showOwnDept(){std::cout<< "Designer can see own dept\n";}
};
int main(){
Employee *E = new Designer;
E->showEveryDept();
// E->showOwnDept(); // will not work, but can be casted dynamically and even statically if sure, to call it!
Designer* D = dynamic_cast<Designer*>(E);
D->showOwnDept();
}
所以我们在这里可以看到,我可以强制转换它并使用多态性,将基类指针指向派生类对象,并且仍然在子类上调用基类可访问方法。还要从子类中调用子类方法,我可以动态地把它回滚,对吧。
但是现在我想做的是,从子类调用中隐藏一个公共类成员,这样子类就不能调用它,但基类对象可以。以showEveryDept() 为例,子类和父类都可以调用它。但是由于设计师和经理已经分配了他们的部门,我不希望他们访问这个功能。
我尝试了一种非常老套的方法来解决这个问题,通过编写另一层 b/w Employee 类和它的子类,就像这样 -
class Employee{
private : char name[5] = "abcd";
void allDept(){ std::cout<<"Woo"; }
public: void tellName(){std::cout << name << "\n"; }
void showEveryDept(){std::cout<< "Employee can see every dept\n";
allDept();}
virtual ~Employee() {}
};
class ELayer: private Employee{
private: using Employee::showEveryDept;
private: using Employee::tellName;
};
class Manager: public ELayer{
private : char dept[5] = "aaaa";
public: void showOwnDept(){std::cout<< "Manager can see own dept\n";}
};
class Designer: public ELayer{
private : char color = 'r';
public: void showOwnDept(){std::cout<< "Designer can see own dept\n";}
};
int main(){
Employee *E = new Designer;
E->showEveryDept();
// E->showOwnDept(); // will not work, but can be casted dynamically
// and even statically if sure, to call it!
Designer* D = dynamic_cast<Designer*>(E);
D->showOwnDept();
}
但看起来很聪明,但它不起作用 -
prog.cc: In function 'int main()': prog.cc:27:23: error: 'Employee' is an inaccessible base of 'Designer' Employee *E = new Designer;
那么我有哪些选择呢?一种愚蠢的方法是将该函数设置为 virtual ,但子类又不会被强制覆盖它,如果他们忘记声明它,它会调用父类的函数?
【问题讨论】:
标签: c++ class c++11 inheritance polymorphism