gpt4 book ai didi

c++ - 将基类传递给期望派生的构造函数时,为什么它们都销毁了自己?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:07 26 4
gpt4 key购买 nike

我知道您不能期望有一个派生引用指向它的基类,因为它会失去功能,但我很好奇实际会发生什么以了解更多有关事件序列的信息。

#include <iostream>

struct Base
{
Base() { std::cout << "Base constructor" << std::endl; }
Base(const Base&) { std::cout << "Base copy constructor" << std::endl; }
~Base() { std::cout << "Base destructor" << std::endl; }
};

struct Derived : public Base
{
Derived(const Base& b) : Base(b) { std::cout << "Derived constructor" << std::endl; }
~Derived() { std::cout << "Derived destructor" << std::endl; }
};


struct OwnsDerived
{
OwnsDerived(const Derived& derivedObject) : derivedRef(derivedObject) { std::cout << "OwnsDerived created..." << std::endl; }

const Derived& derivedRef;
};


int main () {
std::cout << "Main starts: " << std::endl;
const Base b;

std::cout << "\nMain creating object that owns a reference to derived: " << std::endl;
OwnsDerived s(b);

std::cout << "\nMain ends: " << std::endl;
return 0;
}

我得到的结果是:

Main starts: 
Base constructor

Main creating object that owns a reference to derived:
Base copy constructor
Derived constructor <-- why is a derived trying to be created when passing the wrong type in the constructor
OwnsDerived created...
Derived destructor //<-- these are treated as temporaries
Base destructor //<--

Main ends:
Base destructor

即使我将引用更改为对象的拷贝,它的行为也类似,这也让我感到惊讶。

我非常感谢任何指示或任何资源来了解这些构造函数/析构函数的更细微的机制!

最佳答案

OwnsDerived 构造函数通过引用 const 获取 Derived,但您传递的是 Base 实例。因此,编译器将尝试将 Base 实例转换为 Derived。这可以通过调用 Derived 中的(隐式)转换构造函数来实现。因此,创建了 Derived 的临时实例。

要修复隐式转换,请将 Derived 构造函数声明为 explicit .

struct Derived : public Base
{
explicit Derived(const Base& b);
//...
};

关于c++ - 将基类传递给期望派生的构造函数时,为什么它们都销毁了自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56019242/

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