65,210
社区成员
发帖
与我相关
我的任务
分享
class Parent
{
public:
virtual ~Parent();
virtual void FuncForParent() = 0;
};
class Child : public Parent
{
public:
virtual void FuncForChild() = 0;
};
class ParentImpl : public Parent
{
public:
void FuncForParent() {};
};
class ChildImpl : public Child, public ParentImpl
{
public:
void FuncForChild() {}
};
// 这样写好像没法实例化ChildImpl
class Child : virtual public Parent
{
...
};
class ParentImpl : virtual public Parent
{
public:
void FuncForParent() {};
};
class ChildImpl : public Child, public ParentImpl
{
public:
void FuncForChild() {}
};
// 这样写的话可以使用,但是需要改原先的接口
template<class _I=Parent>
class ParentImpl : public _I
{
public:
void FuncForParent() {};
};
template<class _I=Child>
class ChildImpl : public ParentImpl<_I>
{
public:
void FuncForChild() {}
};
typedef ParentImpl<> ParentImplType;
typedef ChildImpl<> ChildImplType;
// 这样写的话也可以使用,但ChildImplType*无法转换成ParentImplType*
// ISample.h
struct ISample
{
virtual void foo(void) = 0;
};
// Sample.h
#include "ISample.h"
class SampleImpl;
class Sample : public ISample
{
public:
Sample(void);
virtual void foo(void);
private:
SampleImpl *imp_;
};
// Sample.cpp
#include "Sample.h"
#include "SampleImpl.h"
Sample::Sample(void)
: imp_(CreateSampleImpl())
{
}
void Sample::foo(void)
{
imp_->foo();
}
// SampleImpl.h
class SampleImpl
{
public:
virtual void foo(void) = 0;
};
// SampleImplOne.h
#include "SampleImpl.h"
class SampleImplOne : SampleImpl
{
public:
SampleImplOne(void);
virtual void foo(void);
};
// SampleImplOne.cpp
#include "SampleImplOne.h"
SampleImplOne::SampleImplOne(void)
{
...
}
void SampleImplOne::foo(void)
{
// foo函数的第一种实现
...
}
// SampleImplTwo.h
#include "SampleImpl.h"
class SampleImplTwo : SampleImpl
{
public:
SampleImplTwo(void);
virtual void foo(void);
};
// SampleImplTwo.cpp
#include "SampleImplTwo.h"
SampleImplTwo::SampleImplTwo(void)
{
...
}
void SampleImplTwo::foo(void)
{
// foo函数的第二种实现
...
}
class ParentImpl : public Parent
{
public:
void FuncForParent() {};
};
class ChildImpl : public Child, public ParentImpl
{
public:
void FuncForChild() {};
void FuncForParent() {ParentImpl::FuncForParent();};
};
// test2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
class Parent
{
public:
virtual ~Parent(){};
virtual void FuncForParent() = 0;
};
class Child : public Parent
{
public:
virtual void FuncForChild() = 0;
};
class ParentImpl : public Parent
{
public:
void ShareFunc(){};
void FuncForParent() {ShareFunc();};
};
class ChildImpl : public Child, public ParentImpl
{
public:
void FuncForChild() {};
void FuncForParent() {ShareFunc();};
};
int _tmain(int argc, _TCHAR* argv[])
{
Child*pChild=new ChildImpl();
return 0;
}