【发布时间】:2016-09-20 10:12:51
【问题描述】:
我有以下带有 2 个类的示例代码:
class B {
public:
int b;
};
class D : public B {
public:
int d;
};
我有一个函数,它接受 B 作为数组并对 b 成员求和:
int sum(B a[], int count){
int sum = 0;
for(int i = 0; i < count; i++) {
sum += a[i].b;
}
return sum;
}
这是我的主要内容:
int main() {
D* a = new D[3];
for(int i = 0; i < 3; i++)
a[i].b = i+1;
cout << "Sum is " << sum(a, 3) << endl;
return 0;
}
我所知道的是,由于切片,这段代码不起作用。我没有得到正确的输出,应该是 6。我试图在 sum 函数中得到参数:
int sum(B& a[], int count)
通过引用传递a,但这会导致编译错误,因为您不能使用引用数组。
我的问题是最好的方法是什么?
目前我的解决方案是将我的数组声明为:
B* a = new D[3];
但尚不完全清楚为什么它不能很好地与以前的实现配合使用。
【问题讨论】:
-
使用
virtual类D和std::vector<std::unique_ptr<B>> -
你能解释一下为什么要让 D 类虚拟化吗?我也在寻找一种不使用 vector 或 unique_ptr 的解决方案,但感谢您的回答
-
给
B一个virtual析构函数。这就是所谓的运行时多态性。 -
“我正在寻找一种不使用矢量或 unique_ptr 的解决方案”。您可以改用原始数组和原始指针,但不建议这样做。您不能将派生类对象数组传递给接受基类对象数组的函数。这是不可能的。
标签: c++ arrays polymorphism pass-by-reference slice