我正在尝试创建一个可用于模板化其他类的类。也许我在寻找错误的关键词。本质上,我希望PrimaryClassA类是纯虚拟的。 DerivedClassC从它们各自的类派生。 问题是,通过调用继承的类: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中覆盖PrimaryClassDerivedClass。您只是在超载。要覆盖它,它们必须具有相同的签名。您可以使用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/

10-15 05:47