我正在尝试创建一个可用于模板化其他类的类。也许我在寻找错误的关键词。本质上,我希望PrimaryClass
和A
类是纯虚拟的。 DerivedClass
和C
从它们各自的类派生。 问题是,通过调用继承的类:C
中的DerivedClass
,我不会覆盖纯虚拟的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;
}
如果无法通过这种方式做到这一点,那么如何使用所需的功能制作通用的面向对象的代码呢?
最佳答案
当然,您并没有在DoFunThings
中覆盖PrimaryClass
的DerivedClass
。您只是在超载。要覆盖它,它们必须具有相同的签名。您可以使用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/