gpt4 book ai didi

c++ - 基于值(value)的向上转型

转载 作者:行者123 更新时间:2023-11-30 02:44:25 27 4
gpt4 key购买 nike

我试图找到一些有关在其层次结构中转换类值的信息,但我只能找到有关将指针转换为类的有用信息。

我们开始吧:

#include <map>
#include <string>
#include <iostream>

class Base {
protected:
std::map<std::string, std::string> properties;
};

class Sub: public Base {
public:
std::string &first_name() {
return properties["first_name"];
}
std::string &last_name() {
return properties["last_name"];
}
};

Base factory() {
Sub sub;
sub.first_name() = "John";
sub.last_name() = "Doe";
return sub;
}

int main() {
Base base(factory());
Sub sub(static_cast<const Sub &>(base));
std::cout << "First name: " << sub.first_name() << std::endl;
std::cout << "Last name: " << sub.last_name() << std::endl;
return 0;
}

上述程序的行为是有问题的还是定义明确的?我基本上是在处理基类的子类,其中只有基类具有属性。所有的子类都只有函数。如果对象从它们的基类自由转换到子类并返回,这会是一个问题吗?

最佳答案

您的 factory 函数按值返回,因此 Sub 在返回中被分割,将返回类型更改为 Base。然后当你向下转换为 Sub 时你有未定义的行为(因为你不能将对象转换为它在任何情况下都不是的类型)并且所有赌注都关闭了。

如果您确实有一个 Sub 对象,该对象暂时被视为 Base 指针或引用,则将其转换回 Sub< 是完全合法的。在这种情况下,一旦 factory 函数返回,您就不再拥有子类对象,因为派生部分已被切掉。

关于c++ - 基于值(value)的向上转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25332217/

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