在将扩展对象作为参数传递给函数时,我尝试使用抽象类,但到目前为止我的尝试导致了一些编译器错误。
我有一些关于问题所在的线索,我显然不允许实例化抽象类,而且我相信 MyClass 中的一些代码正在尝试这样做,即使这不是我的意图。一些研究表明我应该将该对象作为指针引用来实现我想要的,但到目前为止我的尝试都失败了,我什至不确定这是不是答案(因此我在这里问)。
现在我将提交我对 Java 比对 C++ 更熟悉,并且我确信我的部分问题是由于这个。
这是我在我的程序中尝试做的一个例子:
class A {
public:
virtual void action() = 0;
};
class B : public A {
public:
B() {}
void action() {
// Do stuff
}
};
class MyClass {
public:
void setInstance(A newInstance) {
instance = newInstance;
}
void doSomething() {
instance.action();
}
private:
A instance;
};
int main(int argc, char** argv) {
MyClass c;
B myInstance;
c.setInstance(myInstance);
c.doSomething();
return 0;
}
此示例产生了与我在程序中遇到的相同的编译器错误:
sean@SEAN-PC:~/Desktop$ gcc -o test test.cpp
test.cpp:20: error: cannot declare parameter ‘newInstance’ to be of abstract type ‘A’
test.cpp:2: note: because the following virtual functions are pure within ‘A’:
test.cpp:4: note: virtual void A::action()
test.cpp:30: error: cannot declare field ‘MyClass::instance’ to be of abstract type ‘A’
test.cpp:2: note: since type ‘A’ has pure virtual functions
test.cpp: In function ‘int main(int, char**)’:
test.cpp:36: error: cannot allocate an object of abstract type ‘A’
test.cpp:2: note: since type ‘A’ has pure virtual functions
更新
感谢大家的反馈。
从那以后,我将“MyClass::instance”更改为包含 A 类型的指针,但现在我得到了一些与 vtable 相关的奇怪错误:
sean@SEAN-PC:~/Desktop$ gcc -o test test.cpp
/tmp/ccoEdRxq.o:(.rodata._ZTI1B[typeinfo for B]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/ccoEdRxq.o:(.rodata._ZTI1A[typeinfo for A]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
/tmp/ccoEdRxq.o:(.rodata._ZTV1A[vtable for A]+0x8): undefined reference to `__cxa_pure_virtual'
collect2: ld returned 1 exit status
我的修改代码如下(A和B没有修改):
class MyClass {
public:
void setInstance(A* newInstance) {
instance = newInstance;
}
void doSomething() {
instance->action();
}
private:
A* instance;
};
int main(int argc, char** argv) {
MyClass c;
B myInstance;
c.setInstance(&myInstance);
c.doSomething();
return 0;
}