考虑以下代码(最小版本):
#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/