gpt4 book ai didi

c++ - 尝试向模板函数添加多态性

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

是的,您不能拥有模板虚拟类成员函数。这是有道理的,而不是试图弄清楚那部分......我正在像魔鬼一样努力避免多重/虚拟继承。

我有一个模板类 A,一个继承自 A 的抽象模板类 B,以及一个继承自 B 的 C。

template <typename T>
class A
{
protected:
T val;
public:
A(T a) {val = a;}
T val() {return val();}

template <typename J>
A<J> cast_as() { return A<J>((J)val); }
};

template <typename T>
class B : public A<T>
{
protected:
int b;
public:
B(T a) : A(a){b=10*a;}
virtual foo() = 0;
//and I'd like, but this can't exist
//template <typename J>
//B<J>* BCastAs();

};

template <typename T>
class C : public B<T>
{
protected:
int c;
public:
C(T c) : B(c) { c=c+1;}
virtual foo() override { cout << (a+b+c);}
};

int main() { C<int> c(10); B<double>* b = c.BCastAs<double>();}

而且我想不出任何方法来做到这一点......感觉应该是可能的,因为 B* 不需要真正知道它是一个 C(很像克隆调用的返回)但我不知道如何在没有虚拟模板成员函数的情况下让 c 正确移动,这是不可能的。

最佳答案

乍一看,您发布的示例代码似乎存在严重的设计缺陷。

通常类模板中没有必要有虚函数,因为你可以使用 CRT pattern避免它们。

你的意图是你需要继承类(这就是你如何使模板“抽象”),实现定义的接口(interface)。该接口(interface)可以或(最好)不定义为纯虚拟方法(静态接口(interface)检查也可以,并且在缺少方法实现的情况下会导致不那么神秘的编译器错误消息)。

您可以在我的 STTCL template library 中看到此类模板框架的示例以及如何使用此技术。 .

简而言之:使用静态多态。

更新:
是的,我也在 STTCL 中使用纯虚方法,但使用的方式完全不同(只是作为耦合完整继承层次结构集的基本入口点)。

关于c++ - 尝试向模板函数添加多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17435986/

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