gpt4 book ai didi

c++ - 指针和对象切片

转载 作者:太空狗 更新时间:2023-10-29 23:25:34 24 4
gpt4 key购买 nike

我正在学习有关对象切片的困难方法,我想知道是否有可能对指针进行对象切片。换句话说:

  • 指针会成为对象切片的受害者吗?或者只要您使用指针,您就始终不会受到对象切片的影响吗?

最佳答案

这取决于您愿意多宽泛地定义“切片”。从某种意义上说,当您使用基指针(或引用)指向派生对象时,任何非虚函数都会被切分。例如:

class A {
void Print() { cout << "Class A\n"; }
};

class B : public A {
void DoB() {}
void Print() { cout << "Class B\n"; }
};

B b;
A* a = &b;
a->DoB(); // Won't compile!
a->Print(); // Prints "Class A", not "Class B"

DoB 的调用不起作用,因为我们使用的是指向 A 的指针,所以编译器不知道它可以调用 DoB 在那个指针上。这样,您将丢失 B 的一部分,因此您可以将其视为一种切片形式。

特别是最后一行是一种称为“名称隐藏”的现象的示例。因为 Print 没有在基类中声明为 virtual,而我们的指针是 A 类型,编译器不知道它应该调用 B::Print 而不是 A::Print

此问题的一个重要示例与您的析构函数有关:

class A {
~A() {}
};

class B : public A {
std::vector<int> v;
};

A* a = new B;
delete a; // What happens to B::v? Undefined behaviour!

这里,因为析构函数没有被标记为virtual,它在非虚拟上下文中调用了基类的析构函数,这意味着B的析构函数不会'不会被叫到。

关于c++ - 指针和对象切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com