指向模板化虚拟基类的指针问题

问题描述 投票:0回答:1

定义接口的常规方法使用虚拟基类,例如:

class BaseClass_B
    {
    public:
        BaseClass_B() { };
        virtual ~BaseClass_B() { };
        virtual void method(const int &fParam) const = 0;
    };

template <class tDerivedClassParam>
class DerivedClass_B : public BaseClass_B
    {
    void method(const int &fParam) const override final
        {
        // Do something usefull
        }
    };

class FinalClass_B
    {
    public:
        using TypeAlias = int;
    };

然后我可以创建一个派生对象并将其地址分配给派生对象指针和基指针:

DerivedClass_B<FinalClass_B> object_B;
DerivedClass_B<FinalClass_B> *ptr_B;
BaseClass_B *basePtr_B;

ptr_B = &object_B;
basePtr_B = &object_B;

但是,当我尝试做同样的事情时,有一个模板化的虚拟基类:

template <class tBaseClassParam>
class BaseClass_A
    {
    public:
        BaseClass_A() { };
        virtual ~BaseClass_A() { };
        virtual void method(const int &fParam) const = 0;
    };


//
// Note that BaseClass_A<> is defined using a type alias from FinalClass_A
//
template <class tDerivedClassParam>
class DerivedClass_A : public BaseClass_A<typename tDerivedClassParam::TypeAlias>
    {

    void method(const int &fParam) const override final
        {
        // Doe something usefull
        }
    };


class FinalClass_A
    {
    public:
        using TypeAlias = int;
    };

尝试时在最后一行出现错误:

DerivedClass_A<FinalClass_A> object_A;
DerivedClass_A<FinalClass_A> *ptr_A;
BaseClass_A<FinalClass_A> *basePtr_A;

ptr_A = &object_A;
basePtr_A = &object_A;  //<-- Generates error

我得到的编译器错误是:

error: cannot convert ‘DerivedClass_A<FinalClass_A>*’ to ‘BaseClass_A<FinalClass_A>*’ in assignment

我错过了什么???

顺便说一句,我正在使用 C++14。

c++ class templates virtual
1个回答
0
投票

我错过了什么???

basePtr_A
不是指向
DerivedClass_A<FinalClass_A>
或其基类的指针。

BaseClass_A<FinalClass_A::TypeAlias>* basePtr_A;
将是您可以在赋值中使用的基类指针
basePtr_A = &object_A;

© www.soinside.com 2019 - 2024. All rights reserved.