C++ 引用类型和继承问题

C++ 引用类型和继承问题,c++,inheritance,reference,C++,Inheritance,Reference,为什么我的编译器没有对此代码给出警告或错误: class A {}; class B : public A{}; class C : public A{}; int main(int argc,char** args) { B b; A& a = b; C c; a = c; } 我倾向于认为这会导致存储在“b”变量中的数据不再是“b”类型,并且会给我带来一系列问题……那么为什么我能够这样做呢在b的A部分和c的A部分之间执行赋值。这些对象的B和C部分(如

为什么我的编译器没有对此代码给出警告或错误:

class A {};
class B : public A{};
class C : public A{};
int main(int argc,char** args)
{
    B b;
    A& a = b;
    C c;
    a = c;
}

我倾向于认为这会导致存储在“b”变量中的数据不再是“b”类型,并且会给我带来一系列问题……那么为什么我能够这样做呢
b
A
部分和
c
A
部分之间执行赋值。这些对象的
B
C
部分(如果有)未被修改

一般来说,这是一种危险,因为
B
C
对象可能没有被设计为仅分配其
A
子对象。上有关于在类层次结构中处理
运算符=
的各种其他建议。

请参阅注释:

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
}
希望有帮助

为什么我的编译器不给我警告或错误

如果类没有显式声明,则默认情况下,类具有复制构造函数和赋值运算符。因此,可以将派生类(C)的实例分配给基类类型(a)的变量。这种效应称为

要防止出现这种情况,可以在基类中禁用复制构造函数和赋值运算符:

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
}   

谷歌“c++切片”,所以换句话说,我的“b”变量是安全的,但我的“a”变量不会像我期望的那样工作?@DarthRubik我不确定你期望
a
如何工作