class A
{
friend class B;
protected:
int m_iA=0;
}
class B
{
protected:
A m_a;
virtual void func() { m_a.m_iA=1; }
}
class C: class B
{
virtual void func() {m_a.m_iA=2;}
}
在上述關系中,C繼承自B,C多載了B的函式func。
C中多載的func函式希望對其基類B的成員變數m_a做一些不同的操作。
但是因為B對A的友元關系并不能被C繼承,所以這個操作實際是不可行的。
問題:怎樣做才能解決此問題?希望有比較專業的做法。
uj5u.com熱心網友回復:
需要修改一下B:
#include <stdio.h>
class A
{
friend class B;
protected:
int m_iA;
};
class B
{
protected:
A m_a;
virtual void func(int i) {m_a.m_iA = i;}
public:
void print() {printf("%d\n", m_a.m_iA);};
};
class C: public B
{
public:
void test() {func(2);print();}
};
int main()
{
C c;
c.test();
return 0;
}
uj5u.com熱心網友回復:
如果A和B都是MFC里的類,我是不是不能隨便改這些類的定義?如果可以的話,我直接把C加成A的友元類豈不是更方便?
uj5u.com熱心網友回復:
這樣的要求,如果是Delphi、C#可以隨便給A、B打補丁,不需要修改原始碼(甚至可以沒有原始碼),但是標準C++,只能用hacking方法實作:
#include <stdio.h>
class A
{
friend class B;
protected:
int m_iA;
};
class B
{
protected:
A m_a;
virtual void func() {m_a.m_iA = 1;}
public:
void print() {printf("%d\n", m_a.m_iA);} // just for test
};
class C: public B
{
private:
struct IB{
void *vptr;
int m_iA;
};
public:
virtual void func() {((IB *)this)->m_iA = 2;}
};
int main()
{
C c;
c.func();
c.print();
return 0;
}
uj5u.com熱心網友回復:
我剛嘗試了下可以用這中方法解決。不知道這種做法是不是不專業。
class A
{
friend class B;
protected:
int m_iA=0;
}
class B
{
protected:
A m_a;
virtual void func() { m_a.m_iA=1; }
}
class D: class A
{
friend class C;
}
class C: class B
{
virtual void func() {((D*)&m_a)->m_iA=2;}
}
uj5u.com熱心網友回復:
是可以的,就是你這語法有問題,什么編譯器能通過?
uj5u.com熱心網友回復:
有什么語法問題?我在用VS2015uj5u.com熱心網友回復:
class D: class A這語法能通過?

uj5u.com熱心網友回復:
一般公有繼承
uj5u.com熱心網友回復:
class D: public A和class D: A是一樣的,但是class D: class A這肯定不行。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61526.html
標籤:基礎類
上一篇:請問為什么對話框結束之后主視窗也會立刻會被銷毀,沒有達到預期的結果
下一篇:除錯斷言失敗提示open.c的第300行,expression:invalid sharing flag怎么解決啊
