c++ - c 或 c++ 类型转换

标签 c++ c

我在一个类中有两个重载方法,当我调用类的方法时,我传递了一个参数,该参数可以通过向上转换或向下转换来匹配两个重载方法的参数之一。那么哪一个会真正被调用呢?

我的意思是:function1(TypeA x)function1(TypeB x),当我调用function1(m)时,m 可以向上转换为TypeAm 也可以向下转换为TypeB,所以 function1 将叫什么?

最佳答案

问题似乎变了,所以我提到的版本 4 与更多关于类型转换的旧版本相比,它真正询问向上/向下转换。

如果你假设:

class A{};
class B: public A{};
class C: public B{};

void function(const A&);
void function(const C&);

你有一个

C c;
const A& a = c;
const B& b = c;

因此在所有情况下它都引用同一个对象,您调用并获得以下内容

function(a);  // --> function(const A&);
function(b);  // --> function(const A&);
function(c);  // --> function(const C&);

为什么?因为编译器在编译时无法知道(实际上在这个简单版本中它可以——但通常情况并非如此)基类引用对象的运行时类型。因此它只能在安全的备选方案之间进行选择。

向上转型总是可行的,因为它是安全的,因为给定的对象总是具有其基类的所有特性。应避免向下转型,只能通过动态转型来完成。

引用:http://codepad.org/IeYK1fLC

关于c++ - c 或 c++ 类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16830812/

相关文章:

c++ - FD_SET 导致段错误

c++ - 字符串声明

C++ std::string 初始化的不正确行为

c++ - Ros动态配置文件

c - libesmtp 和文件附加

c++ - CentOS 6.5 秒杀

c++ - 在 C++ 中整理我的命名空间

C进程和fork进程

计算 valgrind 错误而不报告它们

c - 为什么我无法检查 C 中结构体的大小? (未声明的错误)