gpt4 book ai didi

c++ - 嵌套抽象基类的通用模板

转载 作者:行者123 更新时间:2023-11-30 05:13:51 26 4
gpt4 key购买 nike

我正在尝试创建一个可用于模板化其他类的类。也许我正在寻找错误的关键词。本质上,我希望 PrimaryClass 和类 A 是纯虚拟的。 DerivedClassC 派生自它们各自的类。 问题是,通过在 DerivedClass 中调用继承类:C,我并没有覆盖纯虚拟 PrimaryClass。我知道这一点,但我不知道如何解决。

我的印象是,因为 C 是从 A 派生的,所以它可以工作。如果我在

中更改 C
virtual void DoFunThings ( C<T>* d ) {}

A 它可以工作,但这样做的目的是允许使用 A 的不同派生版本。

template <class T>
class A
{
public:
virtual void FunThings ( const A<T> &orig, A<T>* new_one ) = 0;
T thing{};
};


template <class T>
class C: public A < T >
{
public:
virtual void FunThings ( const C<T> &orig, C<T>* new_one ) {}

};


template <class T>
class PrimaryClass
{
public:
virtual void DoFunThings ( A<T>* d ) = 0;
};



template<class T>
class DerivedClass: public PrimaryClass<T>
{
public:
virtual void DoFunThings ( C<T>* d ) {}
};


int main ()
{
DerivedClass<int> derived;

return 0;
}

如果不可能以这种方式做到这一点,那么如何才能制作具有我想要的功能的通用面向对象代码呢?

最佳答案

当然,您不会在 DerivedClass 中覆盖 PrimaryClassDoFunThings。您只是重载它。要覆盖它,它们必须具有相同的签名。您可以使用 override 关键字在 C++11 中轻松检测到此错误。

template <class T>
class A
{
public:
virtual void FunThings ( const A<T> &orig, A<T>* new_one ) = 0;
T thing{};
};

template <class T>
class C: public A < T >
{
public:
virtual void FunThings ( const C<T> &orig, C<T>* new_one ) {}
};

template <class T>
class PrimaryClass
{
public:
virtual void DoFunThings ( A<T>* d ) = 0;
};

template<class T>
class DerivedClass: public PrimaryClass<T>
{
public:
virtual void DoFunThings ( C<T>* d ) override {}
};

int main ()
{
DerivedClass<int> derived;
}

现在编译器(在我的例子中是 Clang)将发出一个错误:

test.cpp:27:18: error: 'DoFunThings' marked 'override' but does not override any
member functions
virtual void DoFunThings ( C<T>* d ) override {}

关于c++ - 嵌套抽象基类的通用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43713029/

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