为什么我的编译器没有给我这个代码的警告或错误:
dim = in.nextInt();
row_req = new int[dim];
col_req = new int[dim];
camp = new char[dim][dim];
for (int i = 0; i != dim; i++) {
row_req[i] = in.nextInt();
}
for (int i = 0; i != dim; i++) {
col_req[i] = in.nextInt();
}
我倾向于认为这会导致存储在“b”变量中的数据不再是“B”类型,并且会给我一堆问题....所以为什么我能够这样做。
答案 0 :(得分:1)
a = c;
在A
的{{1}}部分与b
的{{1}}部分之间执行分配。这些对象的A
和c
部分(如果有的话)是未修改的。
通常,这有点危险,因为B
和C
对象可能没有被设计为仅分配其B
子对象。在this thread上提供了在类层次结构中处理C
的各种其他建议。
答案 1 :(得分:1)
见评论:
class A {};
class B : public A{};
class C : public A{};
int main(int argc,char** args)
{
B b; // memory allocated for b to contain A+B
A& a = b; // a is referencing A part of A+B
C c; // memory allocated for c to contain A+C
a = c; // a (A part of A+B) is overwritten from A part of A+C, c is sliced into a
}
希望有所帮助。
答案 2 :(得分:1)
为什么我的编译器没有给我一个警告或错误?
如果未明确声明类,则类具有复制构造函数和赋值运算符(默认情况下)。结果,可以将派生类(C)的实例分配给基类类型(A)的变量。此效果称为slicing。
要防止这种情况,您可以在基类中禁用复制构造函数和赋值运算符:
class A
{
protected:
A() = default;
A(const A & source) = delete;
A & operator = (const A & source) = delete;
};
class B : public A{};
class C : public A{};
int main(int argc,char** args)
{
B b;
A& a = b;
C c;
a = c; // this will not compile
}