读书人

protected继承派生类对象怎么访问基

发布时间: 2012-02-06 15:52:45 作者: rapoo

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。
[解决办法]
探讨
不安全的话,如果用完以后再reinterpret_cast回去行不行呢?

读书人网 >C++

热点推荐