線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1881
推到 Plurk!
推到 Facebook!

語法,多重繼承的問題

尚未結案
Wowo
一般會員


發表:2
回覆:0
積分:0
註冊:2007-12-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-28 11:13:56 IP:59.124.xxx.xxx 訂閱
// H

[code cpp]
#ifndef _TestH
#define _TestH
#include "windows.h"
interface IBase
{
STDMETHODCALLTYPE IBase(){};
virtual ULONG STDMETHODCALLTYPE AddRef(void)=0;
virtual ULONG STDMETHODCALLTYPE Release(void)=0;
};
interface IClassA:public IBase
{
virtual void FunA(void)=0;
};
class TBase:public IBase
{
public:
TBase(void);
virtual ~TBase();
virtual ULONG STDMETHODCALLTYPE AddRef(void);
virtual ULONG STDMETHODCALLTYPE Release(void);
};
class TClassA:public TBase,IClassA
{

public:
TClassA(void);
virtual ~TClassA();
virtual void FunA(void);
};
#endif
/////////////////////////////////////////////////////////////////////////
#include "test.h"
TBase::TBase(void)
:IBase()
{
}
TBase::~TBase()
{
}
ULONG STDMETHODCALLTYPE TBase::AddRef(void)
{
return 0;
}
ULONG STDMETHODCALLTYPE TBase::Release(void)
{
return 0;
}
TClassA::TClassA(void)
{
}
TClassA::~TClassA()
{
}
void TClassA::FunA(void)
{
}
int main(int argc, _TCHAR* argv[])
{
TClassA D;
return 0;
}


[/code]

d:\Test\Test.cpp(32) : error C2259: 'TClassA' : cannot instantiate abstract class
due to following members:
'ULONG IBase::AddRef(void)' : pure virtual function was not defined
d:\Test\Test.h(7) : see declaration of 'IBase::AddRef'
'ULONG IBase::Release(void)' : pure virtual function was not defined
d:\Test\Test.h(8) : see declaration of 'IBase::Release'

請問要如何處理
pctalent
初階會員


發表:0
回覆:6
積分:26
註冊:2005-09-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-09 13:15:48 IP:59.125.xxx.xxx 未訂閱
錯誤訊息之中有說了
TClassA因為沒有實做繼承至IBase的
virtual ULONG STDMETHODCALLTYPE AddRef(void)=0;
virtual ULONG STDMETHODCALLTYPE Release(void)=0;
所以是個abstract class 不能拿來建立物件實體

===================引 用 Wowo 文 章===================
// H

[code cpp]
#ifndef _TestH
#define _TestH
#include "windows.h"
interface IBase
{
STDMETHODCALLTYPE IBase(){};
virtual ULONG STDMETHODCALLTYPE AddRef(void)=0;
virtual ULONG STDMETHODCALLTYPE Release(void)=0;
};
interface IClassA:public IBase
{
virtual void FunA(void)=0;
};
class TBase:public IBase
{
public:
TBase(void);
virtual ~TBase();
virtual ULONG STDMETHODCALLTYPE AddRef(void);
virtual ULONG STDMETHODCALLTYPE Release(void);
};
class TClassA:public TBase,IClassA
{

public:
TClassA(void);
virtual ~TClassA();
virtual void FunA(void);
};
#endif
/////////////////////////////////////////////////////////////////////////
#include "test.h"
TBase::TBase(void)
:IBase()
{
}
TBase::~TBase()
{
}
ULONG STDMETHODCALLTYPE TBase::AddRef(void)
{
return 0;
}
ULONG STDMETHODCALLTYPE TBase::Release(void)
{
return 0;
}
TClassA::TClassA(void)
{
}
TClassA::~TClassA()
{
}
void TClassA::FunA(void)
{
}
int main(int argc, _TCHAR* argv[])
{
TClassA D;
return 0;
}


[/code]

d:\Test\Test.cpp(32) : error C2259: 'TClassA' : cannot instantiate abstract class
due to following members:
'ULONG IBase::AddRef(void)' : pure virtual function was not defined
d:\Test\Test.h(7) : see declaration of 'IBase::AddRef'
'ULONG IBase::Release(void)' : pure virtual function was not defined
d:\Test\Test.h(8) : see declaration of 'IBase::Release'

請問要如何處理
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-01-09 15:00:43 IP:59.124.xxx.xxx 訂閱
virtual public
懶懶泥
一般會員


發表:22
回覆:41
積分:12
註冊:2003-02-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-01-19 13:03:27 IP:59.125.xxx.xxx 訂閱
class TClassA:public TBase,IClassA

因為
TClassA 繼承了 TBase,IClassA 兩個介面,

雖然
TBase有實作了從 IBase 繼承的pure virtual,

interface IClassA:public IBase 卻沒有,

所以
class TClassA:public TBase,IClassA

TClassA 從 IClassA 那邊繼承的 IBase pure virtual function 未實做,故 TClassA 仍是抽象類別。

解決方式已 virtual 繼承
TBase,IClassA 確保只有一份IBase pure virtual function ,或是 interface IClassA 不要繼承 IBase 就可以了


編輯記錄
懶懶泥 重新編輯於 2008-01-19 13:50:40, 註解 無‧
懶懶泥 重新編輯於 2008-01-19 14:29:42, 註解 無‧
系統時間:2024-05-07 22:32:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!