gpt4 book ai didi

c++ - 通过引用传递派生类到以基类为参数的函数

转载 作者:可可西里 更新时间:2023-11-01 18:27:23 24 4
gpt4 key购买 nike

考虑以下代码:

class A {
public:
virtual ~A() { }

virtual void print() const {
std::cout << "In A" << std::endl;
}
};

class B : public A {
public:
B() { }
virtual ~B() { }

virtual void print() const {
std::cout << "In B" << std::endl;
}
};

void doSomething(A* a) {
a->print();
}

void doSomething(const A a) {
a.print();
}

int main()
{
A* a = new B();
doSomething(a);
doSomething(B());
return 0;
}

为什么会这样输出:

In B
In A

但是当您将 doSomething 更改为 doSomething(const A& a) 时,它会输出:

In B
In B

最佳答案

这称为切片

当按值传递 A 时,通过仅复制调用者对象的 A 部分来创建本地拷贝。由于它同时具有 A 的静态和动态类型,因此这是对所选 print 的覆盖。

通过引用传递,该函数获得对具有动态类型 B 的调用者对象的引用,因此选择了覆盖。

使用抽象基类可以防止像这样的混淆行为 - 它们不能直接实例化,因此不能按值传递。

关于c++ - 通过引用传递派生类到以基类为参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20333105/

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