[英]C++ abstract class parameter error workaround
下面的代码片段产生一个错误:
#include <iostream>
using namespace std;
class A
{
public:
virtual void print() = 0;
};
void test(A x) // ERROR: Abstract class cannot be a parameter type
{
cout << "Hello" << endl;
}
除了替换之外/是否有针对此错误的解决方案/解决方法
virtual void print() = 0;
和
virtual void print() = { }
编辑:我希望能够通过使用多态性(即A* x = new B() ; test(x);
)传递任何扩展/实现基类 A 作为参数的类
干杯
由于您无法实例化抽象类,因此按值传递几乎肯定是错误的; 您需要通过指针或引用传递它:
void test(A& x) ...
要么
void test(A* x) ...
按值传递将导致对象切片,几乎可以保证会产生意外(以不好的方式)后果,因此编译器将其标记为错误。
当然,更改签名:
void test(A& x)
//or
void test(const A& x)
//or
void test(A* x)
您的版本不起作用的原因是因为类型A
的对象在逻辑上没有意义。 它是抽象的。 通过引用或指针解决此去因为作为参数传递的实际类型不是A
,但实现类的A
(派生混凝土类)。
绝对清楚,问题是,无论何时定义一个类:
#include <iostream>
class foo {
public:
char *name = (char *)"foo";
};
并将该类的一个实例传递给一个函数,它会创建一个副本:
void bar(foo a) {
a.name = (char *)"bar";
}
int main() {
foo x;
bar(x);
std::cout << x.name << std::endl; // foo
return 0;
}
关于继承,它创建一个副本作为基类的实例:
#include <iostream>
class foo {
public:
char *name = (char *)"foo";
};
class bar: public foo {
public:
char *name = (char *)"bar";
};
void baz(foo a) {
std::cout << a.name << std::endl;
}
int main() {
bar x;
baz(x); // again, foo
return 0;
}
所以,通过做
void baz(AbstractType a) {
...
}
您告诉编译器将AbstractType
复制为AbstractType
本身的实例,这是非法的。 将其作为const AbstractType &a
传递以防止复制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.