抽象类继承

Abstract Class Inheritance

本文关键字:继承 抽象类      更新时间:2023-10-16

不知何故,在定义了AbstractClass之后,我不能让派生类返回派生类的对象。下面的代码有什么问题?

谢谢。代码:

#include <iostream>
using namespace std;
template <typename T>
class AbstractClass {
    public:
        virtual AbstractClass<T> operator[](int index) = 0;
} ;
template <typename T>
class ClassA : public AbstractClass<T> {
    public:
        ClassA<T> operator[](int index){
            ClassA<T> A;
            return A;
        }
} ;
template <typename T>
class ClassB : public ClassA<T> {
    public:
        ClassA<T> operator[](int index){
            ClassA<T> A;
            return A;
        }
} ;
int main(void){
    ClassA<int> A;
    A[0][1][2];
}
错误:

test2.cpp(11): error: return type is neither identical to nor covariant with return type "AbstractClass<int>" of overridden virtual function "AbstractClass<T>::operator[] [with T=int]"
          ClassA<T> operator[](int index){

更改为引用会给出返回局部变量的警告:

#include <iostream>
using namespace std;
template <typename T>
class AbstractClass {
    public:
        virtual AbstractClass<T>& operator[](int index) = 0;
} ;
template <typename T>
class ClassA : public AbstractClass<T> {
    public:
        ClassA<T>& operator[](int index){
            ClassA<T> A;
            return A;
        }
} ;
template <typename T>
class ClassB : public ClassA<T> {
    public:
        ClassA<T>& operator[](int index){
            ClassA<T> A;
            return A;
        }
} ;
int main(void){
    ClassA<int> A;
    A[0][1][2];
}

警告
test2.cpp(13): warning #879: returning reference to local variable
              return A;
                     ^
          detected during instantiation of "ClassA<T> &ClassA<T>::operator[](int) [with T=int]" at line 26

并且,如果通过引用返回,我不知道是否返回一个新对象

有人建议我可以实现一个move构造函数。但是,我发现移动构造函数和模板不能一起工作:使用模板移动操作符

有解决方案吗?

返回AbstractClass<T>作为实例(不是引用或指针)需要构造该类型的副本。这对于抽象类是不可能的。

要实现多态性,在头部分配一个适当子类的实例,并返回一个指针或像std::shared_ptr这样与基类类型化的智能指针。

你有两个地方不对:

  1. 当您返回Base作为实例时,对于派生类,您需要构造相同类型的Base

  2. 当你写像ClassA A这样的东西时,你不指定模板参数。应该是:

    ClassA<T> A;