C++重载函数,一个采用基类的参数,另一个采用派生类的参数
C++ Overloaded function, one takes takes argument of base class, another takes argument of derived class
抱歉,如果这是一个重复的问题,但我自己找不到任何相关结果。
我有类 A,派生自 A 的派生类 B。
我有以下重载功能:
void print(A* obj) {
printf("This is an A object.");
}
void print(B* obj) {
printf(This is a B object.");
}
我主要做以下几点。
B* bObj = new B;
print(bObj);
究竟选择调用的规则是什么?声明重载函数的顺序是否重要?
选择调用的规则到底是什么?
重载解决规则。它们在标准的[over.match]部分中进行了描述。该部分大约有 20 页长,因此简洁的描述可能会有所帮助:其论点明确要求最少转换的候选人是首选。
声明重载函数的顺序是否重要?
是的,但仅与函数调用有关。仅考虑已声明的重载:
void print(A*);
void foo() {
B* ptr = nullptr;
print(ptr); // will call void print(A*)
}
void print(B*);
否则,声明的顺序并不重要。
顺序无关紧要。规则是这样的,必须采取最具体的重载 - 在这种情况下是 B 版本。
另请注意,函数调用是在编译时插入的 - 也就是说,它不依赖于实际的运行时类型,因此不会插入虚拟/动态查找。所以你应该改成
A* bObj = new B;
print(bObj);
然后调用函数 takeA*
。
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 命名参数习惯用法和(抽象)基类
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 如何允许模板参数中的类类型,仅当它有两个基类时
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 根据参数数调用 mixin 基类的构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- C++ 如何使派生类自动获取基类参数
- 将派生类作为参数传递给方法,该方法是具有智能指针的基类
- 如何隐藏模板基类的参数类型
- 根据模板参数引用不同基类的函数
- 继承基构造函数,基类是模板参数 (MSVC)
- C++ 模板:重载时找不到基类类型参数方法
- 是否可以从构造函数自动推断基类模板参数?
- 如何在 C++ 中将参数传递给基类构造函数
- 如何使用 CRTP 创建具有基类的可选模板参数