gpt4 book ai didi

c++ - 模板类继承语法

转载 作者:太空宇宙 更新时间:2023-11-04 14:17:24 26 4
gpt4 key购买 nike

我的意图是有一些基类 CBaseClass除其他事项外,它还充当一些类型 CBaseMember 的成员的容器。 ;然后导出一个CDerivedClass : public CBaseClass拥有 CDerivedMember : public CBaseMember .

我不能使用指向 CBaseMember 的指针并用 CDerivedMember 初始化它CDerivedClass 中的对象因为它是多重继承情况,CDerivedMember有一个与 CBaseClass 无关的附加接口(interface)(纯抽象基类)实现,但需要对 CDerivedClass 可见.我非常想避免大量肮脏的类型转换。

我对这个问题的解决方案是制作CBaseClass一个模板,像这样:

//declaration
template <class Member>
CBaseClass
{
protected:
virtual void GenericMethod();
virtual void VirtualMethod() = 0;

Member* member;
};

//definition
template <class Member>
void CBaseClass<Member>::GenericMethod()
{
member->SomeMemberMethod();
}

然后继承CDerivedClass从中,像这样:

//declaration
CDerivedClass : public CBaseClass<CDerivedMember>
{
protected:
virtual void VirtualMethod();
};

//definition
void CDerivedClass::VirtualMethod()
{
member->SomeDerivedMethod();
}

可以预见,这行不通(CBaseClass<CDerivedMember>::GenericMethod() 未解决,原因显而易见),但不幸的是,我不知道如何更改我的代码以表达我想要它表达的意思。

谁能解释一下这些事情是如何正确完成的——或者为我的问题提出另一种解决方案?

谢谢!

最佳答案

好吧,您可以将脏类型转换保存在一个地方,封装在您的类中。因此,它不再真的脏了。

class CBaseMember {
public:
virtual void SomeMemberMethod(){}
};

class CDerivedMember : public CBaseMember {
public:
virtual void SomeMemberMethod() { /* do other stuff */ }
virtual void SomeDerivedMethod() {}
};

//declaration
class CBaseClass
{
protected:
virtual void GenericMethod();
virtual void VirtualMethod() = 0;

CBaseMember* member;
virtual CBaseMember * getMember() {
return member;
}
};

//definition
void CBaseClass::GenericMethod()
{
getMember()->SomeMemberMethod();
}

//declaration
class CDerivedClass : public CBaseClass
{
protected:
virtual void VirtualMethod();
virtual CDerivedMember * getMember() {return static_cast<CDerivedMember *>(member);}
};

//definition
void CDerivedClass::VirtualMethod()
{
getMember()->SomeDerivedMethod();
}

总而言之,您在派生类的 getMember() 方法中进行了脏类型转换。此时您应该确定成员的类型无论如何都是 CDerivedMember。因此,只要您知道您拥有的指针属于 CDerivedClass 类型,您就可以访问其 CDerivedMember 而无需进行类型转换。如果您必须退回到 CBaseClass 指针,您自然会在访问其成员时退回到 CBaseMember

关于c++ - 模板类继承语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10121503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com