이전 클래스에서 새 클래스를 파생하려고합니다. 기본 클래스 선언은 다음과 같습니다C++에서 모호한이 포인터 해결
그것의 생성자는 다음과 같습니다class Driver : public Plugin, public CmdObject
{
protected:
Driver();
public:
static Driver* GetInstance();
virtual Engine& GetEngine();
public:
// Plugin methods...
virtual bool InitPlugin (Mgr* pMgr);
virtual bool Open();
virtual bool Close();
// CmdObject
virtual bool ExecObjCmd(uint16 cmdID, uint16 nbParams, CommandParam *pParams, CmdChannelError& error);
Mgr *m_pMgr;
protected:
Services *m_pServices;
Engine m_Engine;
};
:
Driver::Driver() :
YCmdObject("Driver", (CmdObjectType)100, true),
m_Engine("MyEngine")
{
Services *m_pServices = NULL;
Mgr *m_pMgr = NULL;
}
내 파생 클래스를 만들 때, 내가 먼저 간단하게 기본 클래스에서 상속하려고 :
을class NewDriver : public Driver
생성자 복사
NewDriver::NewDriver() :
CmdObject("NewDriver", (EYCmdObjectType)100, true),
m_Engine("MyNewEngine")
{
Services *m_pServices = NULL;
Mgr *m_pMgr = NULL;
}
을
컴파일러 (의 VisualDSP ++ 5.0 아나 로그 디바이스는)이 마음에 들지 않았다 감각을했다, 그래서 나는 직접 플러그인 및 CmdObject에서 상속하기로 결정
".\NewDriver.cpp", line 10: cc0293: error: indirect nonvirtual base
class is not allowed
CmdObject("NewDriver", (EYCmdObjectType)100, true),
. 다중 상속 모호성 문제를 (내가 생각) 방지하기 위해, 나는 가상 상속 사용 :
class NewDriver : public Driver, public virtual Plugin, public virtual CmdObject
을하지만, NewDriver에서 가상 메소드의 구현에, 나는 걸리는 관리인 :: RegisterPlugin 메서드를 호출 시도 * 플러그인, 나는이있어 :
".\NewDriver.cpp", line 89: cc0286: error: base class "Plugin" is
ambiguous
if (!m_pMgr->RegisterPlugin(this))
방법이 포인터 모호하고, 어떻게 그것을 해결하는 방법은 무엇입니까?
감사합니다,
- 폴
엄밀히 말하면 기본 클래스 ctor가 매개 변수를 사용하지 않으면 해당 매개 변수를 입력하지 않아도됩니다. 초기화 목록은 자동으로 기본값으로 생성되므로 –
@dash, 그건 완전히 정확하지 않습니다 (적어도 g ++에서는 그렇지 않습니다). 사실 상속 된 유형은 가상 상속되지 않은 유형보다 먼저 초기화됩니다. 따라서 초기화 순서가 실제 상속 계층과 물리적 인 상속 계층 사이에서 다른 경우 일부 컴파일러는 초기화 목록을 생략하고 컴파일러가 다음을 수행 할 수 있도록 초기화 순서에 대한 경고를 표시하기 시작합니다. 주문 자체를하십시오). –
나는 간단하게 말씨를 바꿨다. 나는 여기서 가능한 다른 모든 복잡함에 들어가기를 원치 않는다. –