不知何故,在我定义了一个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
有解决方案吗?
答案 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)
这里有两件事:
当您返回Base
作为实例时,对于派生类,您需要构造相同类型Base
。
当您编写ClassA A
之类的内容时,不指定模板参数。它应该是:
ClassA<T> A;