c++ - 当我收到 `slicing` 的案例时?

标签 c++ class inheritance object-slicing

让我们看下一段代码(例如):

class A {
    int n;
public:
    int f() const { return n; }
    void set(int i) { n = i; }
};
class B : public A {
public:
    int g() const { return f()+1; }
};
void h(const A& a) {
    a.f();
}
int main() {
    B b;
    A& a = b;
    A* ptrA = new B; 
    h(b);
  delete ptrA;
    return 0;
}

现在,让我们看看这些行代码:

A& a = b; // Is there "slicing"? (why?)
A* ptrA = new B; // Is there "slicing"? (why?)
A a = b; // Is there "slicing"? (why?)

我真的不明白什么时候我想使用它们中的任何一个,或者什么时候不允许您使用它们中的任何一个。这些行之间真正的区别是什么..

最佳答案

切片是指将派生对象分配给基础实例。例如:

B b;
A a = b;

这里的问题是被调用的 A 的复制构造函数只能看到 BA 部分,因此只会收到。如果您的派生类添加了额外的数据或覆盖了 A 的行为,这就是一个问题。

当您将对象分配给引用或指针时,没有切片。所以

A &a = b;

没问题,就这样:

A *a = &b;

关于c++ - 当我收到 `slicing` 的案例时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49296414/

相关文章:

VBA 类及其自身集合

java - 使用 Java 方法创建密码检查器

swift - Self 类型的存储变量(特别是在子类化时)

c++ - 当指定的数据成员是引用类型时,关于类成员访问的问题

c++ - 线程作为成员变量

class - VB6中Public Property、Friend和Public Variable有什么区别

class - 标记 Haxe 类进行强制扩展?

c# - C# 中的泛型继承?

c++ - 优化文件打开和读取

C++ 代码可以在 CentOS g++ 中编译,但不能在 Visual studio 2008 中编译