定义接口的常规方法使用虚拟基类,例如:
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。
我错过了什么???
basePtr_A
不是指向 DerivedClass_A<FinalClass_A>
或其基类的指针。
BaseClass_A<FinalClass_A::TypeAlias>* basePtr_A;
将是您可以在赋值中使用的基类指针 basePtr_A = &object_A;
。