抽象类继承

时间:2016-09-01 20:04:52

标签: c++ templates abstract-class

不知何故,在我定义了一个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 operator with templates

有解决方案吗?

2 个答案:

答案 0 :(得分:1)

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

要实现多态,请在头上分配相应子类的实例,并返回一个指针或类似import os from subprocess import Popen, PIPE, STDOUT os.system('mkdir c:\\temp\\vhd') p = Popen( ["diskpart"], stdin=PIPE, stdout=PIPE ) p.stdin.write("create vdisk file=c:\\temp\\vhd\\test.vhd maximum=2000 type=expandable\n") p.stdin.write("attach vdisk\n") p.stdin.write("create partition primary size=10\n") p.stdin.write("format fs=ntfs quick\n") p.stdin.write("assign letter=r\n") p.stdin.write("exit\n") p.stdout.close os.system('fsutil file createnew r:\dummy.txt 6553600') #this doesn´t get executed 的智能指针。

答案 1 :(得分:1)

这里有两件事:

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

  2. 当您编写ClassA A之类的内容时,不指定模板参数。它应该是:

    ClassA<T> A;