protected继承,派生类对象如何访问基类成员?
有如下代码:
- C/C++ code
class A{public: void f(){cout << "From Class A: SHIT!" << endl;}};class B{public: void g(){cout << "From Class B:" << endl;}};void callf(A&a) {a.f();}void callg(B&b) {b.g();}上面是两个类class A和class B,还有两个全局函数:callf(&A)和callg(&B)。分别在这两个全局函数中调用f()和g(),要求实现一个类C,分别用public和protected继承A和B。然后实例化C,在主函数中以C的实例作为参数,调用两个全局函数。这样能否通过编译?如果不能, 不改变程序的继承结构和全局函数, 修改程序, 实现要求。
按照要求,对于第一问,可以写出如下代码:
- C/C++ code
#include<iostream>using namespace std;class A{public: void f(){cout << "From Class A: SHIT!" << endl;}};class B{public: void g(){cout << "From Class B:" << endl;}};void callf(A&a) {a.f();}void callg(B&b) {b.g();}class C:public A, protected B{};int main(){ C c; callf(c); callg(c); return 0;}这个代码编译自然是通不过,在callg(c)这个地方,保护继承的话,派生类对象肯定没法调用基类的方法了。那么要怎么改呢?先谢谢了~
[解决办法]
下面这样就可以满足楼主的设想:
- C/C++ code
#include<iostream>using namespace std;class A{public: void f(){cout << "From Class A: SHIT!" << endl;}};class B{public: virtual void g() // 改为virtual { cout << "From Class B:" << endl; }};void callf(A* a) {a->f();} // 改用指针void callg(B* b) {b->g();} // 改用指针class C:public A, protected B{};int main(){ C* c = new C; callf(c); callg(reinterpret_cast<B*>(c)); // 这个地方要进行强制转换 return 0;}
[解决办法]
用reinterpret_cast的话,太暴力了点。
如果reinterpret_cast也算,又何必改那么多?只需要改一句就行了。把main函数中的:
callg(c);
这句改成:
callg(reinterpret_cast<B&>(c));
其它都不用动。
[解决办法]
[解决办法]
另外,友元可以的。不要friend callg,应该friend main。
[解决办法]