gpt4 book ai didi

C++ - 通过引用派生调用的基本实现?

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:29 24 4
gpt4 key购买 nike

考虑以下代码(最小版本):

#include <iostream>

struct Base
{
virtual ~Base() {}

virtual void test() const { std::cout << "base"; }
};

struct Derived : public Base
{
void test() const { std::cout << "derived"; }
};

struct Composite
{
const Derived &ref;

Composite(const Derived &ref) : ref(ref) {}

void testRef() const { ref.test(); }
};

int main()
{
Composite c((Derived()));
c.testRef();
}

当使用最新的 MinGW g++ 时,这实际上会产生“基础”!那是编译器错误还是我遗漏了什么?有人可以在 VS 中对此进行测试吗?

我认为自己是一名经验丰富的 C++ 程序员,经常使用多态性、基于堆栈的引用、临时对象(C++ 标准 12.2)等。因此我知道应该应用生命周期延长。

此行为仅在 Base 中定义析构函数(虚拟或非虚拟)并使用临时对象时发生,即。 e.以下用法会产生“派生”:

int main()
{
Derived d;
Composite c(d);
c.testRef();
}

最佳答案

Composite c((Derived()));

这一行创建了一个Derived类型的临时对象,将其传递给c的构造函数,然后销毁该临时对象。在那之后,所有赌注都取消了。

关于C++ - 通过引用派生调用的基本实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16328608/

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