引用类型和继承问题

时间:2016-04-05 23:20:06

标签: c++ inheritance reference

为什么我的编译器没有给我这个代码的警告或错误:

        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”类型,并且会给我一堆问题....所以为什么我能够这样做。

3 个答案:

答案 0 :(得分:1)

a = c;A的{​​{1}}部分与b的{​​{1}}部分之间执行分配。这些对象的Ac部分(如果有的话)是未修改的。

通常,这有点危险,因为BC对象可能没有被设计为仅分配其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
}