C++ 抽象类继承

C++ 抽象类继承,c++,templates,abstract-class,C++,Templates,Abstract Class,不知何故,在我定义了一个抽象类之后,我不能让派生类返回派生类的对象。以下代码有什么问题 谢谢 代码: #包括 使用名称空间std; 模板 类抽象类{ 公众: 虚拟抽象类运算符[](int索引)=0; } ; 模板 ClassA类:公共抽象类{ 公众: ClassA运算符[](整数索引){ 甲级; 返回A; } } ; 模板 B类:公共A类{ 公众: ClassA运算符[](整数索引){ 甲级; 返回A; } } ; 内部主(空){ 甲级; A[0][1][2]; } 错误: test2.cpp

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

谢谢

代码:

#包括
使用名称空间std;
模板
类抽象类{
公众:
虚拟抽象类运算符[](int索引)=0;
} ;
模板
ClassA类:公共抽象类{
公众:
ClassA运算符[](整数索引){
甲级;
返回A;
}
} ;
模板
B类:公共A类{
公众:
ClassA运算符[](整数索引){
甲级;
返回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){
test2.cpp(11):错误:返回类型与重写的虚拟函数“AbstractClass::operator[[with T=int]”的返回类型“AbstractClass”既不相同也不协变
ClassA运算符[](整数索引){
更改为reference会发出返回局部变量的警告:

#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];
}
#包括
使用名称空间std;
模板
类抽象类{
公众:
虚拟抽象类和运算符[](int索引)=0;
} ;
模板
ClassA类:公共抽象类{
公众:
ClassA和运算符[](整数索引){
甲级;
返回A;
}
} ;
模板
B类:公共A类{
公众:
ClassA和运算符[](整数索引){
甲级;
返回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
test2.cpp(13):警告#879:返回对局部变量的引用
返回A;
^
在第26行实例化“ClassA&ClassA::operator[](int)[带T=int]时检测到
而且,如果我通过引用返回,我不知道要返回一个新对象

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


有解决方案吗?

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


要实现多态性,请在头上分配相应子类的实例,并返回一个指针或智能指针,如使用基类键入的
std::shared\u ptr

这里有两个错误:

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

  • 当您编写诸如
    ClassA
    之类的内容时,您不会指定模板参数。它实际上应该是:

    ClassA<T> A;
    
    ClassA;
    

  • 在否决投票之前。告诉代码/问题中有什么错误。我将尝试修复。错误消息实际上有什么不清楚的地方?为什么类A的方法不能返回类A,尽管抽象类说该方法可以返回抽象类,而类A是从抽象类派生出来的?或者,使类A的方法成为抽象类的解决方案是什么SSA和Casb返回CyrA?这不是C++中多态性的工作方式,你必须使用引用或指针来利用有意义的多态性。我把它变成了。当我尝试引用时返回局部变量问题。谢谢指出这个错误。你需要一个指针,或者一个移动结构。tor,因此要传输所有权,请不要在堆栈上返回指向局部变量的指针或引用!在返回方法后,它将无效。您需要在堆上分配一个对象,然后返回(smart)指向它的指针。@ThomasBPreusser这不是我的意思。这就是我的意思:
    返回新的ClassA;
    ,是的,你必须释放显式返回的对象。当然,如果你有智能指针或移动构造函数,那将是不必要的。模板和移动构造函数不能混合使用。
    ClassA<T> A;